前言
经过三周的学习已经对pytorch框架有了大致掌握,这周学习一种新的打标签目录结构,同时学习动态学习率调整
回顾
前几周打标签的目录结构为
data--------
|------class1
|------calss2
|……
这周目录标签结构为
data--------
|------test
| ----|-------calss1
| ----|-------class2
|------train
| ----|-------class1
| ----|-------class2
个人感觉后者目录结构更为清楚,推荐使用这种方式。
模型搭建与训练
这部分与前几周完全类似,不再赘叙
模型如下
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.conv1 = nn.Sequential(
nn.Conv2d(3, 12, kernel_size=5, padding=0), # 12*220*220
nn.BatchNorm2d(12),
nn.ReLU())
self.conv2 = nn.Sequential(
nn.Conv2d(12, 12, kernel_size=5, padding=0), # 12*216*216
nn.BatchNorm2d(12),
nn.ReLU())
self.pool3 = nn.Sequential(
nn.MaxPool2d(2)) # 12*108*108
self.conv4 = nn.Sequential(
nn.Conv2d(12, 24, kernel_size=5, padding=0), # 24*104*104
nn.BatchNorm2d(24),
nn.ReLU())
self.conv5 = nn.Sequential(
nn.Conv2d(24, 24, kernel_size=5, padding=0), # 24*100*100
nn.BatchNorm2d(24),
nn.ReLU())
self.pool6 = nn.Sequential(
nn.MaxPool2d(2)) # 24*50*50
self.dropout = nn.Sequential(
nn.Dropout(0.2))
self.fc = nn.Sequential(
nn.Linear(24 * 50 * 50, len(classeNames)))
def forward(self, x):
batch_size = x.size(0)
x = self.conv1(x) # 卷积-BN-激活
x = self.conv2(x) # 卷积-BN-激活
x = self.pool3(x) # 池化
x = self.conv4(x) # 卷积-BN-激活
x = self.conv5(x) # 卷积-BN-激活
x = self.pool6(x) # 池化
x = self.dropout(x)
x = x.view(batch_size, -1) # flatten 变成全连接网络需要的输入 (batch, 24*50*50) ==> (batch, -1), -1 此处自动算出的是24*50*50
x = self.fc(x)
return x
动态学习率调整
先看完整代码
def adjust_learning_rate(optimizer, epoch, start_lr):
# 每 2 个epoch衰减到原来的 0.98
lr = start_lr * (0.98 ** (epoch // 2))
for param_group in optimizer.param_groups:
param_group['lr'] = lr
optimizer.param_groups参数
# # 调用官方动态学习率接口时使用
# lambda1 = lambda epoch: (0.92 ** (epoch // 2)
# optimizer = torch.optim.SGD(model.parameters(), lr=learn_rate)
# scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1) #选定调整方法
上述代码含义是每隔两轮更新一次学习率。
为啥要动态调整学习率?
https://developer.baidu.com/article/detail.html?id=1811142,该链接中阐述:
通过对比实验结果,我们发现适当的调节学习率能够显著提高模型的训练效果。例如,在一个图像分类任务中,我们采用了一种动态学习率调整策略,根据模型在训练过程中的表现动态地调整学习率。实验结果表明,这种策略相比固定学习率能够更好地提高模型的分类准确率和训练速度。
实验结果
采用动态学习调整率
不采用动态学习调整率
总结
由上述结果看以看出,采用动态学习调整率对训练精度会产生影响,比没有采用动态学习调整率模型要高出4%个百分点左右。