研究报告(7.6-7.12)
致访客:
您可以根据引用部分来判断此文章是否包含您需要的知识。
本次研究报告涉及的问题有:
- 在anaconda环境下安装pytorch可能出现的问题;
- pytorch神经网络代码结构分析;
- 神经网络基本的参数对比分析。
研究目标
- 安装cuda、cudnn、pytorch,并验证。
- 运行Pytorch的示例代码,并思考代码各个部分的含义,以及如何修改可以提高模型性能。
研究过程
安装
- 因为平时的习惯是在conda环境中写代码,所以将所有库安装到conda环境中。
- 在Anaconda的base环境中,选择cuda、cudnn、pytorch 3个库,点击安装即可。
- 验证:
- 在Anaconda界面中,可以看到base环境中已经安装了cuda、cudnn、pytorch三个库。
- 打开命令提示框,输入
conda list
,可以找到3个库对应的位置
运行
-
在Pycharm中新建Project,选择虚拟环境为conda的base环境,这样就可以直接使用已经下载好的库。
-
复制代码并运行。
代码分析
- 在框架上,代码主要可以分为以下几个结构:
- 准备训练集:从开放数据集中下载数据集
- 准备测试集:从开放数据集中下载
- 设置样本数
- 加载数据集
- 定义模型
- 设置损失函数
- 设置优化函数
- 定义训练方法
- 定义测试方法
- 设置迭代数
- 实例化定义好的模型,并加载已训练好的模型文件
- 进行预测
- 定义测试集与训练集 Datasets:
- 数据集需要通过类来定义,继承了
torchvision.datasets.minist
,重载def getitem(self, index):
和def len(self):
。 - 其中len返回数据集的大小,getitem接受index,返回图片数据和标签,其中index通常指的是一个list的index,这个list的每个元素就包含了图片数据的路径和标签信息。
- 而对于制作这个list,通常的方法是将图片的路径和标签信息存储在一个txt中,然后从该txt中读取。
- 加载数据集 Data Loader:
- Dataset类的核心是,读入数据集数据并且对读入的数据进行了索引
- 加载器需要类来定义,继承了
torch.util.data.dataloader.DataLoader
,由此我们可以得出结论:定义数据集需要我们自己设计代码,而加载器不需要。 - batch_size: 分批次读取
- num_workers = 可以并行加载数据(利用多核处理器加快载入数据的效率)
- 损失函数 loss function
pytorch中有不同的损失函数,例如:
- L1 范数损失 L1Loss
- 均方误差损失 MSELoss
- 交叉熵损失 CrossEntropyLoss
- 负对数似然损失函数 NLL Loss
- 优化器 optimizer
pytorch中有很多优化器,例如
- SGD (stochastic gradient descent)
- Adam
- AdaGrad
- RMSprop
- 时期、批大小与迭代 Epoch, Batch size & Iteration :
- Epoch: 样本集内所有的数据经过了一次训练
- Batch Size: 使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为“batch”。
- Iteration: 迭代是 batch 需要完成一个 epoch 的次数。
-
定义测试方法与训练方法
-
实例化与测试:
- 实例化:
model = NeuralNetwork()
- 加载模型参数:
model.load_state_dict(torch.load("model.pth"))
其中,load_state_dict
,表示加载模型的参数,这个函数返回一个包含模型状态信息的字典。
参数调节
可以通过改变以下参数,调整模型性能:
- 调节batch size
batch size | Accuracy | Avg loss |
---|---|---|
1 | 81.8% | 0.526808 |
5 | 69.4% | 0.996658 |
10 | 62.1% | 1.168192 |
32 | 45.7% | 1.204643 |
50 | 43.5% | 2.214385 |
100 | 39.2% | 2.240298 |
- 调节epoch
Epoch | Accuracy | Avg loss |
---|---|---|
1 | 39.6% | 2.185659 |
5 | 45.7% | 1.204643 |
10 | 55.81% | 1.334948 |
- 调节loss fuction
Loss function | Accuracy | Avg loss |
---|---|---|
Cross Entropy Lost | 45.7% | 1.204643 |
NLL Lost | 10% |
- 调节optimizer
Optimizer | Accuracy | Avg loss |
---|---|---|
SGD | 45.7% | 1.204643 |
Adam | 54.66% | 1.225095 |
AdaGrad | 43.5% | 1.463934 |
RMSprop | 10% | 2.302585 |
- 调节lr (learning rate 学习率)
Learning Rate | Accuracy | Avg loss |
---|---|---|
1e-1 | 75.98% | 0.635123 |
1e-2 | 55.4% | 1.310048 |
1e-3 | 45.7% | 1.204643 |
1e-4 | 58.2% | 2.198819 |
1e-5 | 20.6% | 2.291760 |
讨论
安装
- 浅显了解了cuda、cudnn的作用:
- CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台。CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。
- NVIDIA cuDNN是用于深度神经网络的GPU加速库。
- cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。
出处。
- 对Pycharm中虚拟环境的使用有了更深刻的理解。
- 在新建项目时选择conda的base环境,每次即可直接使用已经下载好的第三方库。
pip install
下载到Python库中,而conda install
下载到conda的库中。- 学习到了如何解决安装中可能出现的问题,如
current channel is unavailable
:可以通过指定库从镜像网站下载解决。
代码与参数调节
- 了解了pytorch的代码框架、流程。例如,在第一次已经下载好
DataSet
后,可以在DataLoader
注释掉download = true
,直接加载本地数据集即可。 batch size
和epoch
有最优值,使得模型性能最好。经过观察可以发现,Accuracy
随着epoch
的增加而提高。- 通过调节不同的参数可以改变模型的性能,但不同的参数的适用范围有限,比如在修改
loss function
参数时,L1Loss
和MSELoss
仅对二分类问题有效,本次运行的代码是多分类,需要对张量进行转换,但还没有具体实现。
问题与思考
- 后面的学习中可以更深入地学习每个模块对应的代码,如定义自己的数据集与数据集类,按照实际需求定义张量等。
- 对于衡量模型性能的指标,本次利用了
Accuracy
和Average Loss
,可以学习如何利用其他方式衡量模型性能。 - 对于
loss function
的选取,可以学习如何经过转换(如softmax
)后,使用不同种类的损失函数。 - 可以更深入了解不同的损失函数和优化器在实际问题中的选择。
代码运行问题
在首次运行代码后,我遇到了如下问题,希望有小伙伴解答一下~
尝试过:删除数据集并重新下载,使用IP代理下载。
引用&致谢
- 源代码:pytorch官网tutorial-quickstart
- 研究过程-安装:
- 研究过程-代码分析:
- 研究过程-参数调节:
(待补充)