pytorch图像分类实战

pytorch图片高清 pytorch 图片分类_数据

1. 数据集展示

训练集图片和测试集图片分别存放在train和vaild文件夹中,文件夹1,2,3…表示类别。

pytorch图片高清 pytorch 图片分类_分类_02

pytorch图片高清 pytorch 图片分类_分类_03

2. 导入包

pytorch图片高清 pytorch 图片分类_pytorch_04

3. 读取数据和预处理

设置数据存储路径

pytorch图片高清 pytorch 图片分类_分类_05

pytorch图片高清 pytorch 图片分类_pytorch图片高清_06


pytorch图片高清 pytorch 图片分类_pytorch_07

pytorch图片高清 pytorch 图片分类_分类_08


pytorch图片高清 pytorch 图片分类_深度学习_09


4. 加载模型

pytorch图片高清 pytorch 图片分类_分类_10


pytorch图片高清 pytorch 图片分类_pytorch图片高清_11


param.requires_grad=False设置网络参数param迭代训练过程不更新。

pytorch图片高清 pytorch 图片分类_pytorch_12

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层。不清楚模型结构或者名称,可以打印出来看

pytorch图片高清 pytorch 图片分类_深度学习_13


best.pt文件用于保存模型

params_to_update用于保存需要更新的model参数5. 优化器设置

pytorch图片高清 pytorch 图片分类_深度学习_14


使用optim提供的Adam优化器,传入需要更新的参数params_to_update和初始化的学习率lr。

scheduler是定义的学习率衰减器,通过其调用step()进行累计计数,每累计到step_size,学习率衰减为原来的gamma倍。6.迭代训练

pytorch图片高清 pytorch 图片分类_数据_15

pytorch图片高清 pytorch 图片分类_pytorch图片高清_16


pytorch图片高清 pytorch 图片分类_数据_17


pytorch图片高清 pytorch 图片分类_pytorch_18


pytorch图片高清 pytorch 图片分类_数据_19


optimizer.param_groups[0][‘lr’]从优化中获取初始化的学习率

pytorch图片高清 pytorch 图片分类_深度学习_20

7. 训练之前冻住的所有层

在fc全连接层训练好之后,解冻其他层,并重新训练所有层。

pytorch图片高清 pytorch 图片分类_数据_21


8. 加载训练好的模型

pytorch图片高清 pytorch 图片分类_数据_22


9.测试

pytorch图片高清 pytorch 图片分类_pytorch_23


pytorch图片高清 pytorch 图片分类_pytorch_24


需要将预测的结果preds_tensor由tenser转化为numpy,gpu直接调用numpy(),cpu需调用cpu().numpy()。10.数据展示

pytorch图片高清 pytorch 图片分类_分类_25


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个样本的次数。