在上一期:卷积神经网络--猫狗系列之下载、导入数据集,如果测试成功就说明对数据的预处理工作已经完成,接下来就是构建模型阶段了:
据说建立一个神经网络模型比较简单,只要了解了各层的含义、不同层之间参数的传递等等,那么一个完整的网络模型就可以被容易地构建出来。(这对于我这种初学的同学来说嘎嘎困难哈哈)
不扯了,加载一个预训练模型---ResNet50:
借助torchvision库,能够很容易的获得一组已经训练好的模型,这些模型大多数接收一个称为pretrained的参数,当这个参数为True时,它会下载为ImageNet分类问题调整好的权重。
network1=models.resnet50(weights=models.ResNet50_Weights.DEFAULT)
紧接着,我们需要冻结所有层,所有的权重不会随着训练而更新:
for param in network1.parameters():
param.requires_grad=False
然后!由于这个预训练模型不是专门针对这样猫猫狗狗的二分类问题,所以,我们需要将最后一层的输出特征从1000改为2。(默认是1000类)
首先,我们需要知道最后一层的名字,通过network1查看一下,告诉大家怎么操作:
将network1输在pycharm中,把光标放在这一行,然后快捷键【shift+alt+E】(也可以鼠标选中然后右键专门运行这一行,这其实就是pycharm的交互模式)
得到这样的界面:
【可以知道最后一层是一个全连接层,名为fc。其他的东西以后有时间再分析,就是一些卷积、池化以及激活操作】
所以,我们就要将最后一层替换为输出特征为2的全连接层:
import torch.nn as nn
network1.fc=nn.Linear(2048,2)
此时,该层为新的层,所以它的requires_grad=True,这样整个网络仅有这一层可以更新权重。
打印更新后的网络:
该猫猫狗狗的模型构建代码总结:
from torchvision import models
import torch.nn as nn
import torch.optim as optim
#网络搭建
network1=models.resnet50(weights=models.ResNet50_Weights.DEFAULT)
for param in network1.parameters():
param.requires_grad=False
network1.fc=nn.Linear(2048,2)
利用已经训练好的模型主要目的是它能够提取出非常好的特征,最后一层接收前面层提取的特征,然后误差反向传播,仅更新这一层的权重,不断迭代。
【此猫狗系列会继续更】