dataloader本質上是一個可迭代對象,使用iter()訪問,不能使用next()訪問;
使用iter(dataloader)返回的是一個迭代器,然后可以使用next訪問;
也可以使用for inputs,labels in enumerate(dataloader)形式訪問,但是enumerate和iter的區別是什么呢?暫時不明白。
補充:
如下代碼形式調用enumerate(dataloader'train')每次都會讀出一個batchsize的數據,可根據以下代碼做一個測試。下面代碼的前提是,數據集中總共包含245張圖像,dataloader'train'設置時drop_last=True,其中batch_size=32,經過以下代碼后輸出的count為224(正好等於32*7),而多出來的245-224=21張圖像不夠一個batch因此被drop掉了。換句話說,enumerate(dataloader'train')會把dataloader'train'中的數據一個batch一個batch地取出來用於訓練。也就是說,使用enumerate進行dataloader中的數據讀取用於神經網絡的訓練是第一種數據讀取方法,其基本形式即為for index, item in enumerate(dataloader'train'),其中item中0為數據,1為label.
count=0 for index, item in enumerate(dataloader['train']): count+=len(item[1].numpy) print(count)
第二種讀取dataloader中數據的方法是使用默認的iter函數,其基本樣式可參照以下代碼:
for epoch in range(opt.begin_epoch,opt.end_epoch): iter=myDataLoader['train'].__iter__() #返回值iter是一個基本的迭代器 batchNum=len(myDataLoader['train']) #返回batch的數量,如上應該等於7 myNet.train() #使得我定義的網絡進入訓練模式 for i in range(0,batchNum): batchData=iter.__next__() #讀取一個batch的數據,batchsize=32時實際對應32張圖像 img=batchData[0].to(opt.device) #opt.device=cuda,即轉移到GPU運行 ...
還有一個tqdm后續補充!!!
tqdm是一個可以顯示進度條的模塊
from tqdm import tqdm for item in tqdm(range(100)): # do something
enumerate()函數是python的內置函數,可以同時遍歷lt中元素及其索引,i是索引,item是lt中的元素,如圖:
from tqdm import tqdm lt=['a','b','c'] for i, item in enumerate(lt): print(i,item) #輸出結果如下: 0 a 1 b 2 c
tqdm和enumerate()結合
from tqdm import tqdm lt=['a','b','c'] for i,item in enumerate(tqdm(lt)) print(i,item)
以上關於tqdm部分內容轉載自:https://blog.csdn.net/m0_37586991/article/details/89435193
原文鏈接:https://www.daimajiaoliu.com/daima/479d31ca3100408