第P4周:猴痘病识别


🍺要求:

  1. 训练过程中保存效果最好的模型参数。

  2. 加载最佳模型参数识别本地的一张图片。

  3. 调整网络结构使测试集accuracy到达88%(重点)。
    🍻拔高(可选):

  4. 调整模型参数并观察测试集的准确率变化。

  5. 尝试设置动态学习率。

  6. 测试集accuracy到达90%。


一、运行结果

本周的代码相对于上周增加指定图片预测保存并加载模型这个两个模块,在学习这个两知识点后,时间有余的同学请自由探索更佳的模型结构以提升模型是识别准确率,模型的搭建是深度学习程度的重点

图片格式预处理

模型参数

正式训练

可视化结果

训练集的准确性和损失函数较为良好,但是测试集的准确性波动较大,且停在0.85左右,考虑是过拟合,尝试修改通道数、和模型结构


二、知识拓展/个人总结

1.transforms.Normalize(mean,std)正态分布

从头训练,不使用任何预训练权重必须用你自己数据集统计出来的 mean /std,方法就是:随机抽取全部 / 部分图片,分别统计 RGB 三个通道像素均值、标准差,填入 Normalize。

原理回顾 ToTensor + Normalize 流程

  1. transforms.ToTensor()
    PIL 图片 (H,W,3) → Tensor (3,H,W),像素从 0~255 缩放至 0,1 浮点数。
  2. 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)删除所有的归一化

相关推荐
luj_176812 分钟前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
geats人山人海3 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz4 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni4 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu4 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7984 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭4 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶4 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶5 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展
图灵机z5 小时前
【算法提高课】AcWing 1027. 方格取数 长期攻克提高课-day3(3/219)
算法