如何迭代数据集数据进行训练
这个话题有点大,只是自己的一点点体会。自己的代码是用的pytorch框架,如果是tensorflow可能不大一样。
为了达到容易说明的目的,我们可以先用流程图方式对过程进行表达,后面再对图中重要点进行说明:
注:具体代码顺序,你可以先创建数据集子类实例,接着创建模型和损失函数实例,最后创建优化器实例,一并传入train_loop主程序即可,三个实例的创建没有固定顺序,在训练之前,创建好即可。
1. 各种参数如数据集路径超参数等:变动的参数最好不要写死在文件中,代码维护比较容易,可以使用命令行形式将参数传给程序。可以使用argparse库对命令行参数进行封装成一个实例,使用非常简单,该库的说明:
下面是如何使用
命令行执行python主程序 :
python main.py --dataset=yourdatasetname --dataset_path=../input/yourdatasetname --num_iters=80000 --model=modelname --loss=soft_triplet --comment=training_yourmodelname
2. 使用torch.utils.data.Dataset封装你的数据集:我们在训练之前,需要对数据进行预处理,pytorch提供了许多方法使得数据读取和预处理变得很容易。torch.utils.data.Dataset是代表自定义数据集方法的抽象类,你的子类需要实现__getitem__(...)和__len__(...)两个魔术方法。
如何需做到预处理呢?如计算机视觉方面可以使用torchvision.transforms.Compose进行组合变形:将多个变形组合在一起:
该类如何使用请参考:
https://www.jianshu.com/p/2d44138d511b
3. dataset子类需要结合torch.utils.data.DataLoader一起使用:我们知道在深度学习中,如使用SGD优化算法进行梯度计算时,都是按照批次的方式,而不是通过一个一个地使用样本进行学习,torch.utils.data.Dataset只提供__getitem__()一个一个地得到样本,所以我们还需要torch.utils.data.DataLoader修饰器,可以实现batch批次进行迭代计算,shuffle设置成True可以 在每一个epoch中的数据重新洗牌(次序打乱),以及可以多线程读取数据等优点(手动狗头)。
实现如下:
如想详细了解dataset, dataloader请参考:
pytorch源码分析之torch.utils.data.Dataset类和torch.utils.data.DataLoader类
4. 使用torch.nn.Module,torch.autograd.Function实现你的模型子类和定义损失函数类:模型子类需要继承torch.nn.Module,主要是选用那种深度学习框架模型,实现你的自定义网络层,forward()等。损失函数类需要继承torch.autograd.Function,实现自己的forward(self, features)和backward(self, grad_output),具体如何实现自己的模型和损失函数类,请参考其他资料,这里不一一赘述。
5. tqdm工具类:是python中一个好用的迭代器和智能进度库,能够迭代任意可迭代对象,比如List, array,字符串, dataloader等。
下面是如何使用:
结果片段:
6. batch size, iteration, epoch: 考虑到性能问题,比如总共有50000个样本,不是一次性输入到网络进行训练,而是分批次进行,比如一个批次有500个,那么500就是batch size, 也即是一个iteration:1个iteration不是指50000个,而是500个,完成一次总样本50000个的一轮叫1个epoch,所以1epoch = 完成50000个样本过程=50000/500=100 iterations.