Fork me on GitHub

Pytorch中dataloader之enumerate与iter,tqdm

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

posted @ 2021-04-12 17:11  stardsd  阅读(4829)  评论(0编辑  收藏  举报