- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
🍺要求:
训练过程中保存效果最好的模型参数。
加载最佳模型参数识别本地的一张图片。
调整网络结构使测试集accuracy到达88%(重点)。
🍻拔高(可选):调整模型参数并观察测试集的准确率变化。
尝试设置动态学习率。
测试集accuracy到达90%。
一、运行结果
本周的代码相对于上周增加指定图片预测与保存并加载模型这个两个模块,在学习这个两知识点后,时间有余的同学请自由探索更佳的模型结构以提升模型是识别准确率,模型的搭建是深度学习程度的重点
图片格式预处理

模型参数

正式训练

可视化结果

训练集的准确性和损失函数较为良好,但是测试集的准确性波动较大,且停在0.85左右,考虑是过拟合,尝试修改通道数、和模型结构
二、知识拓展/个人总结
1.transforms.Normalize(mean,std)正态分布
从头训练,不使用任何预训练权重必须用你自己数据集统计出来的 mean /std,方法就是:随机抽取全部 / 部分图片,分别统计 RGB 三个通道像素均值、标准差,填入 Normalize。
原理回顾 ToTensor + Normalize 流程
transforms.ToTensor()
PIL 图片 (H,W,3) → Tensor (3,H,W),像素从 0~255 缩放至 0,1 浮点数。transforms.Normalize(mean, std)
逐通道计算:xout=x−mean/std
mean/std必须是 0,1区间下统计出来的值,不能用 0~255 的像素均值。
抽取样本计算自己数据集 mean & std 完整代码
ini
import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 仅做ToTensor,不能带Normalize!
calc_transform = transforms.Compose([
transforms.Resize((224, 224)), transforms.ToTensor()
])
# 你的数据集路径
data_dir = "./total_data_root"
dataset = datasets.ImageFolder(data_dir, transform=calc_transform)
loader = DataLoader(dataset, batch_size=64, shuffle=False, num_workers=0)
# 初始化累计值
channels_sum = torch.zeros(3)
channels_sq_sum = torch.zeros(3)
pixel_total = 0
for imgs, _ in loader:
# imgs shape [B,3,224,224]
batch_size, c, h, w = imgs.shape
pixel_num = batch_size * h * w
# 三通道分别求和、平方求和
channels_sum += torch.sum(imgs, dim=[0, 2, 3])
channels_sq_sum += torch.sum(imgs ** 2, dim=[0, 2, 3])
pixel_total += pixel_num
# 计算均值
mean = channels_sum / pixel_total
# 方差
E(x²) - E(x)² var = channels_sq_sum / pixel_total - mean ** 2
std = torch.sqrt(var)
print("数据集均值 mean:", mean.tolist())
print("数据集标准差 std:", std.tolist())
抽样加速技巧(数据量大时不用遍历全部)
数据几万张时遍历很慢,可以循环提前 break,只取前几千张抽样计算,结果偏差极小:
python
for idx, (imgs, _) in enumerate(loader):
# 只取前200个batch抽样
if idx > 200:
break # 统计逻辑同上
2.尝试修改模型提高准确率
a) channel均为12
a) 运算结果

b)每层只进行一次卷积,并将学习率修改至0.001

运算结果

C)删除第一层的归一化
运行结果 
d)删除所有的归一化
