猴痘病识别-第四周

  • 本文为365天深度学习训练营 中的学习记录博客
  • 参考文章:Pytorch实战 | 第P4周:猴痘病识别
  • 原作者:K同学啊|接辅导、项目定制

要求:√

训练过程中保存效果最好的模型参数。
加载最佳模型参数识别本地的一张图片。
调整网络结构使测试集accuracy到达88%(重点)。

拔高(可选):√
调整模型参数并观察测试集的准确率变化。
尝试设置动态学习率。
测试集accuracy到达90%。

一、 基础知识

1.1 torch.squeeze()详解

压缩维度,去掉维数为1的的维度
参数:
input (Tensor):输入Tensor
dim (int, optional):如果给定,输入将只在这个维度上被压缩
例如:


```python
torch.Size([2, 1, 2, 1, 2])
>>> y = torch.squeeze(x)
>>> y.size()
torch.Size([2, 2, 2])
>>> y = torch.squeeze(x, 1)
>>> y.size()
torch.Size([2, 2, 1, 2])

1.1 torch.unsqueeze()详解

1.1 torch.squeeze()详解
压缩维度,去掉维数为1的的维度
参数:
input (Tensor):输入Tensor
dim (int, optional):如果给定,输入将只在这个维度上被压缩
例如:

torch.Size([2, 1, 2, 1, 2])
>>> y = torch.squeeze(x)
>>> y.size()
torch.Size([2, 2, 2])
>>> y = torch.squeeze(x, 1)
>>> y.size()
torch.Size([2, 2, 1, 2])

1.3 动态学习率

模型在训练初期调高学习率,网络能快速收敛,训练后期减小学习率,可以让网络收敛到最优。
利用torch.optim.lr_scheduler提供的函数:LambdaLR(自定义函数)、StepLR(固定步长衰减)、MultiStepLR(多步长衰减)、ExponentialLR(指数衰减)、CyclicLR(周期性学习率策略)
本文采用CyclicLR,用法如下:

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1)
data_loader = torch.utils.data.DataLoader(...)
for epoch in range(10):
    for batch in data_loader:
        train_batch(...)
        scheduler.step()

二.关键实验步骤

2.1 训练结果和可视化图

使用天气识别中用到的模型,并更改优化器为Adam。
猴痘病识别-第四周_第1张图片
猴痘病识别-第四周_第2张图片

2.2 保存并加载模型

# 模型保存
PATH = './model.pth'  # 保存的参数文件名
torch.save(model.state_dict(), PATH)

# 将参数加载到model当中
model.load_state_dict(torch.load(PATH, map_location=device))

2.3 指定图片预测

from PIL import Image 

classes = list(total_data.class_to_idx)

def predict_one_image(image_path, model, transform, classes):
    
    test_img = Image.open(image_path).convert('RGB')
    # plt.imshow(test_img)  # 展示预测的图片

    test_img = transform(test_img)
    img = test_img.to(device).unsqueeze(0)
    
    model.eval()
    output = model(img)

    _,pred = torch.max(output,1)
    pred_class = classes[pred]
    print(f'预测结果是:{pred_class}')
    # 预测训练集中的某张照片
predict_one_image(image_path='./data/4-data/Others/NM01_01_00.jpg', 
                  model=model, 
                  transform=train_transforms, 
                  classes=classes)

在这里插入图片描述

2.4 调整模型参数

将学习率改为1e-3:
猴痘病识别-第四周_第3张图片
测试集准确率很快达到最优解,但起伏较大。

将学习率改为1e-5:
猴痘病识别-第四周_第4张图片
测试集准确率稳步上升,网络收敛速度比较慢。

2.5 设置动态学习率

使用SGD优化器,lr_scheduler采用CyclicLR:

optimizer        = torch.optim.SGD(model.parameters(),lr=learn_rate,momentem=0.9)
scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=learn_rate*n1, max_lr=learn_rate*n2)
.......
    optimizer.zero_grad()  # grad属性归零
    loss.backward()        # 反向传播
    optimizer.step()       # 每一步自动更新
    
    scheduler.step()   # 更新优化器的学习率(需要加上这行)
.......

2.6 最终结果

猴痘病识别-第四周_第5张图片
猴痘病识别-第四周_第6张图片

总结

1.本次学习动态学习率,学习CyclicLR的用法。
2.学习了保存加载模型和指定图片预测的方法。
3.优化器改为Adam测试效果比较好,网络可以快速收敛。若使用SGD,需要寻找到一个合适的学习率衰减策略(比如CyclicLR),但还不如直接改用Adam理想。

参考

PyTorch中的动态学习率
动态学习率

你可能感兴趣的:(深度学习,pytorch,人工智能)