Datawhale X 李宏毅苹果书 AI夏令营(进阶Task2)

1.理论学习

1.1 自适应学习率

        传统的梯度下降方法为所有参数设置了相同的固定学习率,这在实践中可能不是最优选择,因为不同的参数可能需要不同的学习率。

        由于连简单的误差表面都做不好,因此引入自适应学习率,即:通过为每个参数分配不同的学习率来提高优化过程的效果。

分类如下:

优化算法用途公式特点
AdaGrad        通过每个参数的历史梯度平方的累积均值来调整学习率

\theta_{i,t+1}\leftarrow \theta_{i,t}-\frac{\eta }{\sigma _{i,t}}g_{i,t}

其中,\sigma _{i,t}=\sqrt{\frac{1}{t+1}\sum_{i=0}^{t}\left ( g_{i,t} \right )^2}

        适合处理稀疏数据,学习率会单调递减,可能导致训练过早停滞
RMSProp        通过指数衰减平均来控制梯度历史的重要性,动态调整学习率

\theta_{i,t+1}\leftarrow \theta_{i,t}-\frac{\eta }{\sigma _{i,t}}g_{i,t}

其中,

\sigma _{i,t}=\sqrt{\alpha \left (\sigma_{i,t-1} \right )^2+\left ( 1-\sigma \right )\left ( g_{i,t} \right )^2}

        可以更好地适应新出现的梯度变化,解决了AdaGrad中学习率过快下降的问题
Adam        结合了RMSProp的自适应学习率和动量法的优点

\theta_{i,t+1}\leftarrow \theta _{t}-\frac{\eta }{\sqrt{\hat{v_{t}}}+\epsilon }\cdot \hat{m_{t}}

其中,

\hat{m_{t}}=\frac{m_{t}}{1-\beta _{1}^{t}}\hat{v_{t}}=\frac{v_{t}}{1-\beta _{2}^{t}}m_{t}=\beta _{1}m_{t-1}+\left ( 1- \beta_{1} \right )g_{t}

v_{t}=\beta _{2}v_{t-1}+\left ( 1- \beta_{2} \right )g_{t}^{2}

        使用动量作为参数更新的方向,并且能够自适应调整学习率

1.2 学习率调度

        在深度学习中,模型在优化过程中面临突然“爆炸”的现象,学习率调度是一种策略,它根据训练的不同阶段动态调整学习率,以促进模型的训练过程。

两种策略如下:

学习率调度策略    描述    优点    缺点
学习率衰减(Learning Rate Decay)        随着训练的进行,逐步减小学习率。        有助于模型更平滑地收敛到全局最小值,防止学习率过大导致的震荡        如果衰减速度过快,可能导致模型收敛速度缓慢。

预热

(Warm-up)

        开始时使用较小的学习率,逐渐增加至正常水平后再逐渐减小        在训练初期使用较小学习率探索误差表面,收集有关梯度的信息,等统计结果较准确后再提升学习率,有助于避免过早陷入局部最小值。        需要额外调整预热阶段的长度及学习率增长速度等超参数。

1.3 分类

        回归任务预测一个连续的值,而分类任务预测一个离散的标签。分类可以被视为回归的一种特殊情况,其中输出通过激活函数转换为概率分布。

区别如下:

任务类型输出层激活函数损失函数类别表示方式示例
回归

无需激活函数

(线性激活)

均方误差-预测房价
二分类Sigmoid交叉熵损失独热编码

识别垃圾邮件

(正类:垃圾邮件,负类:非垃圾邮件)

多分类Softmax交叉熵损失独热编码

图像分类

(多个类别,如狗、猫、鸟等)

2. HW3-图像分类

 2.1 速通Homework3

Step1: 准备与创建算力

Step2: 一键运行Notebook

1.获得的数据集和代码文件

点击“Terminal”打开命令行窗口,输入以下代码并按下回车键。

git lfs install

git clone https://www.modelscope.cn/datasets/Datawhale/LeeDL-HW3-CNN.git

2. 一键运行代码

        等待约几分钟后即可获得结果。通过单元格(cell)查看模型的训练准确率。生成的submission.csv`文件包含分类结果,可提交至Kaggle进行评估。

模型网络架构

验证集t-SNE可视化分布

解决问题

git下载hw3_data文件是空的,大小130B。

解决办法:

sudo apt update
sudo apt install git-lfs

2.2 代码简单学习

一个深度神经网络训练模型的代码,大概需要完成下面的内容:

  • 导入所需要的库/工具包

  • 数据准备与预处理

        数据准备包括从指定路径加载图像数据,并对其进行预处理。作业中对图像的预处理操作包括调整大小和将图像转换为Tensor格式。为了增强模型的鲁棒性,可以对训练集进行数据增强。

  • 定义模型

部分解析:

  1. 继承声明:class Classifier(nn.Module) 表明这是一个自定义的神经网络模块,继承自PyTorch提供的基础模块类nn.Module。
  2. 初始化方法:__init__ 方法用于定义网络的结构。在这个方法里,首先调用了父类nn.Module的初始化方法super(Classifier, self).__init__(),这是必要的步骤,确保了父类的初始化逻辑被正确执行。
  3. 卷积层定义:通过nn.Sequential定义了一个序列化的卷积神经网络结构self.cnn,包括多个卷积层、批归一化层、ReLU激活函数和最大池化层。每个卷积层都定义了输入通道数、输出通道数、卷积核大小、步长和填充。
  4. 全连接层定义:同样地,self.fc 是一个顺序容器,包含了几个全连接层和ReLU激活函数。最后的全连接层输出大小为11,这表明该分类器旨在解决一个多类别分类问题,其中共有11个类别。
  5. 前向传播方法:forward 方法定义了输入数据通过网络的计算流程。输入张量x 应当具有形状(batch_size, 3, 128, 128),即每一批数据包含多个3通道的128x128像素的图像。在经过卷积层处理后,输出会被展平成二维张量,以便能够作为全连接层的输入。最终,通过全连接层得到的输出具有形状(batch_size, 11),代表对于每个输入图像的11个类别的预测得分。
  • 定义损失函数和优化器等其他配置

部分解析:

  1. criterion = nn.CrossEntropyLoss() # 交叉熵损失函数,用于评估模型预测与真实标签之间差异的损失函数。
  2.  optimizer = torch.optim.Adam(model.parameters(), lr=0.0003, weight_decay=1e-5) #初始化一个Adam优化器,用于更新模型的参数。
  • 训练模型

  • 评估模型

部分解析:

  1. loss = criterion(logits, labels.to(device)) # 计算交叉熵损失,无需手动应用softmax。
  2. acc = (logits.argmax(dim=-1) == labels.to(device)).float().mean() #统计预测正确的样本占总样本的比例,准确率越高,表示模型的预测效果越好。
  • 进行预测

此范式不仅适用于图像分类任务,对于广泛的深度学习任务也是适用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值