- 本文为365天深度学习训练营 中的学习记录博客
- 参考文章:Pytorch实战 | 第P4周:猴痘病识别
- 原作者:K同学啊|接辅导、项目定制
要求:√
训练过程中保存效果最好的模型参数。
加载最佳模型参数识别本地的一张图片。
调整网络结构使测试集accuracy到达88%(重点)。
拔高(可选):√
调整模型参数并观察测试集的准确率变化。
尝试设置动态学习率。
测试集accuracy到达90%。
压缩维度,去掉维数为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.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])
模型在训练初期调高学习率,网络能快速收敛,训练后期减小学习率,可以让网络收敛到最优。
利用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()
# 模型保存
PATH = './model.pth' # 保存的参数文件名
torch.save(model.state_dict(), PATH)
# 将参数加载到model当中
model.load_state_dict(torch.load(PATH, map_location=device))
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)
将学习率改为1e-3:
测试集准确率很快达到最优解,但起伏较大。
将学习率改为1e-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() # 更新优化器的学习率(需要加上这行)
.......
1.本次学习动态学习率,学习CyclicLR的用法。
2.学习了保存加载模型和指定图片预测的方法。
3.优化器改为Adam测试效果比较好,网络可以快速收敛。若使用SGD,需要寻找到一个合适的学习率衰减策略(比如CyclicLR),但还不如直接改用Adam理想。
PyTorch中的动态学习率
动态学习率