第四周运动品牌识别

前言

经过三周的学习已经对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%个百分点左右。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值