PyTorch 迁移学习实现过程中,FC层的定义的实现流程。
PyTorch 迁移学习:
-
- 通过特征提取迁移学习: 替换与训练模型的FC层,并把它换成 softmax分类。 把CNN预训练模型作为特征提取器,通过逻辑回归进行分类。
-
- 通过微调进行迁移学习: 通过构建全新的FC层头部,并架在原有的网络层上,CNN权重被冻结,然后我们训练新的层头(通过设置小的学习率)。我们可以解冻训练的网络主体然后训练整个网络 将网络体的输出视为空间维数为M × N × C的任意特征提取器
第一种方法简单,第二种方法会更加准确,导致模型更加一般化。
- 通过微调网络架构,需要做一些重要的参数调整,例如图片像素
- 1 指定ImageNet平均值、标准偏差和图像大小
MEAN = [0.485, 0.456, 0.406]
STD = [0.229, 0.224, 0.225]
IMAGE_SIZE = 224
* 2 定义RGB颜色空间中像素强度的均值和标准差。
· 这些值是研究人员在ImageNet数据集上训练他们的模型获得的。他们循环遍历ImageNet数据集中的所有图像,从磁盘加载它们,并计算RGB像素强度的平均值和标准偏差。
· 然后在训练前将均值和标准差值进行图像像素归一化。
· 即使我们没有使用ImageNet数据集进行迁移学习,我们仍然需要执行与ResNet训练时相同的预处理步骤;否则,模型将不能正确地理解输入图像。
训练
- 1.移动图片和分类类别到CPU/GPU
- 2.在数据上做预测
- 3.计算权重,梯度,更新模型权重和0梯度
- 4.统计每一步的训练误差
- 5.统计正确的预测值
评估
- 模型转成评估模式,计算我们的总损失和正确验证预测的数量。 汇总了我们的培训/验证损失和准确性,更新我们的训练历史,然后将损失/准确性信息打印到我们的终端
二,微调CNN训练我们的模型
-
- 与特征提取类似,我们首先从网络中移除FC层头,但这次我们创建了一个全新的层头,带有一组线性、ReLU和dropout层,类似于你在现代最先进的CNN上看到的。 可执行的一些方案:
- 冻结网络体中的所有层,训练层头
- 冻结所有的层,训练层头,然后解冻身体,也进行训练
- 简单地把所有的层都解冻,一起训练
-
- 定义模型头
# define the network head and attach it to the model
headModel = nn.Sequential(
nn.Linear(numFeatures, 512),
nn.ReLU(),
nn.Dropout(0.25),
nn.Linear(512, 256),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(256, len(trainDS.classes))
)