pytorch图像分类实战
1. 数据集展示
训练集图片和测试集图片分别存放在train和vaild文件夹中,文件夹1,2,3…表示类别。
2. 导入包
3. 读取数据和预处理
设置数据存储路径
4. 加载模型
param.requires_grad=False设置网络参数param迭代训练过程不更新。
models.resnet18()中的参数pretrained设置为True,表示可更新resnet18模型的参数。set_paremeter_requires_grad()冻住resnet18,不能更新参数。model_ft.fc.in_features表示找到resnet18中叫做fc的网络层,并获取in_features的值。model_ft.fc=nn.Linear(num_ftrs,102)重新定义resnet18的fc层。不清楚模型结构或者名称,可以打印出来看
best.pt文件用于保存模型
params_to_update用于保存需要更新的model参数5. 优化器设置
使用optim提供的Adam优化器,传入需要更新的参数params_to_update和初始化的学习率lr。
scheduler是定义的学习率衰减器,通过其调用step()进行累计计数,每累计到step_size,学习率衰减为原来的gamma倍。6.迭代训练
optimizer.param_groups[0][‘lr’]从优化中获取初始化的学习率
7. 训练之前冻住的所有层
在fc全连接层训练好之后,解冻其他层,并重新训练所有层。
8. 加载训练好的模型
9.测试
需要将预测的结果preds_tensor由tenser转化为numpy,gpu直接调用numpy(),cpu需调用cpu().numpy()。10.数据展示
image*np.array((0.229,0.224,0.225))+np.array((0.485,0.456,0.406))对数据进行归一化还原。
image.transpose():
如果图片image的大小为cxhxw,image.transpose(1,2,0)表示将image的维度转为hxwxc。
Batchnorm2d:
在卷积神经网络的卷积层之后总会添加BatchNorm2d进行数据的归一化处理,这使得数据在进行Relu之前不会因为数据差异过大而导致网络性能的不稳定。
nn.Dropout(0.5):
表示剪枝神经网络枝干,避免网络过拟合,0.5表示剪枝的程度。
batch_size和epoch:
在神经网络模型训练时,比如有1000个样本,把这些样本分为10批,就是10个batch。每个批(batch)的大小为100,就是batch_size=100。
每次模型训练,更新权重时,就拿一个batch的样本来更新权重。epoch表示需要重复遍历1000个样本的次数。