最近看完了花书的CNN,然后到github上找了个pytorch的教程《PyTorch-book》看了前6个章节,对pytorch框架有了大致的了解,想着先实践一下玩玩,一来提高兴趣,二来光是看不写代码是没啥用的,所以就参考网上相对简单的代码实现了一遍LeNet(《PyTorch-book》中的第六章也是实战,代码写的非常标准,但是感觉对于第一次接触pytorch的人来说,似乎要求有些太高了,所以就没有仿照那个编写)。
本文主要是按照“参考博文”的代码写了一遍,练了练手。代码就仅仅是按照我的思路捋了一遍,更改了一下顺序而已,其他都是一样的。本文主要就讲解一下代码的思路和我的一些理解。
数据集采用的是torchvision中的minst,Loss function采用的CrossEntropyLoss,优化器采用的是SVD,模型就是最经典的LeNet模型。
我的整个ipynb文件的代码组织思路如下所示
- 定义超参数
- 整理数据集(用到torchvision和dataloader)
- 得到Trainset, 并得到一个Trainset dataloader (在这个代码里,没有将训练集进一步划分validation set,如果有需要的话可以按照7:3左右的比例将trainset划分为trainset and validation set)
- 得到Testset, 并得到一个Testset dataloader
- 定义网络(用到nn.Module)
- 定义损失函数和优化器
- 训练模型
- 测试模型
- 保存训练好的模型参数
- 利用之前训练的模型的参数来加载模型
对于原来博客中的代码这里有一个地方有所修改,在模型的训练前加上了model.train(),即进入训练模式;在模型的测试前加上了model.eval(),即进入了测试模式。可以参考这篇博文进行一个简单的理解:https://blog.csdn.net/LoseInVain/article/details/86476010。当然在这个LeNet模型中,加不加应该是一样的,因为没有batchnorm和dropout,因此实际上model.train()和model.eval()没有起到作用。但是最好还是加上比较好,养成习惯吧。
由于这个是最经典的模型,也不难就不做更为具体的介绍了,详细的可以看我的ipynb代码,或者生成html,里面也加了注释,应该比较好理解。若有啥问题也可以在评论里留言。