“Datawhale X 李宏毅苹果书 AI夏令营”----------Datawhale暑期夏令营第五期·李宏毅深度学习(进阶班)【学习笔记2】

#“Datawhale X 李宏毅苹果书 AI夏令营”

第 3 章 深度学习基础

3.3 自适应学习率

概念:

自适应学习率(adaptive learning rate):给每一个参数不同的学习率。如果在某一个方向上,梯度的值很小,非常平坦,我们会希望学习率大一点;如果在某一个方向上非常陡峭,坡度很大,我们会希望学习率可以设得小一点。

【大白话,动态地 调整 学习率】

448ca2e27b804ddcb6927801e6b1c670.png

参考学习:

  2.3 自适应学习率(Adaptive learning rate)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/fengguowuhen0230/article/details/130205653

以下是常见的自适应学习率算法:

3.3.1 AdaGrad

AdaGrad(Adaptive Gradient) 是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。 AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大。
 

a46d274e28f34e30845b3b25235b0388.png

8f1ad8ebb47d4a07866598b0fb2d0792.png

9f1b81bcb7d4489c8cd25045d4fb9274.png77bf1674458049448913f48404021d50.png

f9290b3302034d2aa0ac33292f7fb394.png

对比学习:

AdaGrad优化器(理论、公式、代码实现)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_48923489/article/details/136854257

3.3.2 RMSProp

RMSprop(Root Mean Squared propagation):同一个参数的同个方向,学习率也是需要动态调整。

0265c5e331d24c019559e33a64440bb3.png

a0fd0e93bab14f6ebaa3797f26da7a74.png

RMSProp Explained | Papers With Codeicon-default.png?t=N7T8https://paperswithcode.com/method/rmspropc492ad060f06421fa86b8dc213feb566.png

RMSProp — PaddleEdu documentation (paddlepedia.readthedocs.io)icon-default.png?t=N7T8https://paddlepedia.readthedocs.io/en/latest/tutorials/deep_learning/optimizers/rmsprop.htmlRMSProp:基于自适应学习率的优化算法-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_70911440/article/details/134750757

3.3.3 Adam


最常用的优化的策略或者优化器(optimizer) 是Adam(Adaptive moment estimation) [7]。 Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。 PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需要人为决定,但是往往用 PyTorch 预设的参数就足够好了。

374060d32f374ed5a3a6d10ad89f80db.png

866935a8ea0940aa8c6d17ef39df0e40.png

Adam vs RMSprop:比较两种优化算法的表现与优缺点# 1.背景介绍 随着深度学习和机器学习技术的发展,优化算 - 掘金 (juejin.cn)

3.4 学习率调度

(1)问题阐述:

(2)概念:

学习率调度(Learning Rate Scheduling):是深度学习训练过程中一个重要的技术,用于动态调整学习率以优化模型的收敛速度和稳定性。
学习率衰减(learning rate decay)也称为学习率退火(learning rateannealing),是学习率调度中最常见的策略。具体操作是:随着参数的不断更新,让 η 越来越小,

如图 3.28 所示。图 3.22b 的情况,如果加上学习率下降,可以很平顺地走到终点,如图 3.29 所示。在图 3.22b 红圈的地方,虽然步伐很大,但 η 变得非常小,步伐乘上 η 就变小了,就可以慢慢地走到终点。
 

(3)常见的学习率调度策略包括:

(4)如何实现:

PyTorch中怎么实现学习率调度 - 小航博客 (csbsgyl.com)icon-default.png?t=N7T8https://www.csbsgyl.com/14157.html

3.5 优化总结
 

3.6 分类

3.6.1 分类与回归的关系

回归任务

回归任务的目标是预测一个连续值的输出,给定一个输入向量 x,模型输出一个预测值 y^​,目标是使 y^尽可能接近实际的标签值 y。

分类任务

分类任务的目标是预测一个离散的类别标签。然而,可以将分类任务视为回归的一种特殊情况,即输出是一个离散的数值,代表不同的类别。

分类作为回归的局限性

  • 顺序关系假设:如果直接将类别编码为连续的整数(例如,类 1 编号为 1,类 2 编号为 2,类 3 编号为 3),那么这种方法会隐含地假设类别之间存在某种顺序关系。例如,在预测年级的例子中,一年级和二年级被赋予了相邻的数字,这暗示了一年级和二年级比一年级和三年级更相似。
  • 类别间距离无关:如果类别之间不存在自然的顺序或距离关系,那么这种编码方式就会出现问题。例如,类别 1、2 和 3 没有特定的关系,直接用数字表示类别会导致模型误解类别间的相似性。

解决方案

  • 独热编码:为了避免上述问题,通常使用独热编码(one-hot encoding)来表示类别。这意味着每个类别会被表示为一个向量,其中只有一个元素为 1,其余均为 0。例如,对于三个类别,它们分别被编码为 [1, 0, 0]、[0, 1, 0] 和 [0, 0, 1]。这样,模型就不会假设类别之间的任何特定关系。

总结

虽然分类任务可以被视为一种特殊的回归任务,但为了更好地处理类别之间的关系,通常采用独热编码来表示类别。这样做不仅可以避免错误地假设类别间的顺序关系,还可以使得模型能够更准确地学习类别之间的差异。

3.6.2 带有 softmax 的分类

  1. 分类过程概述:分类任务的基本流程包括输入数据 x,通过一系列变换(如矩阵乘法和偏置加法),然后通过激活函数 σ,最终得到一个向量 y^【输入 x,乘上 W,加上 b,通过激活函数 σ,乘上W ′,再加上 b′ 得到向量 yˆ。】

  2. 这个向量 y^ 通常包含各个类别的未归一化的得分。【实际做分类的时候,往往会把 yˆ 通过 softmax 函数得到 y′,才去计算 y′ 跟 yˆ 之间的距离】

  3. Softmax 函数的作用:为了将 y^转换为概率分布,通常会应用 softmax 函数。softmax 函数首先对 y^中的每个元素取指数,这一步将所有值转换为正数。接着,将所有指数化的值相加得到总和,然后用每个指数化的值除以这个总和来进行归一化,使得最终的概率分布之和为 1。

  4. Softmax 函数的特性:softmax 函数不仅能够将原始的输出转化为概率分布,还具有放大原始输出中最大值和最小值之间差距的效果。这意味着较大的值经过 softmax 函数后会变得更加突出,而较小的值则趋于接近 0。

Softmax 函数 的公式:

公式解析:

  • 给定 y^=[3,1,−3],应用 softmax 函数后的结果是 [0.88,0.12,几乎 0]
  • 这里,exp(3)=20、exp(1)=2.7 和 exp(−3)=0.05,归一化后分别变为约 0.88、0.12 和几乎为 0。
  • 通过 softmax 函数,可以看到原本较大的值(3)在归一化后占据了更大的比例,而较小的值(-3)则趋近于 0。

结论

在分类任务中,softmax 函数是一种常用的工具,用于将模型的原始输出转换成概率分布。这不仅保证了输出的非负性和归一化性质,而且还能有效地突出最大值,使得模型能够清晰地区分不同类别

3.6.3 分类损失

  1. 分类任务流程:【1】首先将输入 x ,【2】通过神经网络,【3】得到预测输出 y^,【4】然后通过 softmax 函数将 y^​ 转换成概率分布 y′。【5】之后,需要计算 y′与真实标签 y之间的差异,这一差异可以用作损失函数的依据。
  2. 损失函数的选择:文中提到了两种常用的损失函数——均方误差和交叉熵。均方误差是计算预测概率分布与真实标签之间的平方差之和;而交叉熵则是计算预测概率分布与真实标签之间的对数差之和。

  3. 交叉熵的优势:文中指出,尽管均方误差和交叉熵在 y′与 y相同的情况下都能达到最小值,但是从优化的角度来看,交叉熵通常更为优越。这是因为,在预测概率与真实标签相差较大时,交叉熵的梯度更大,这意味着优化过程中的学习速率更快,更容易收敛。

  4. 优化过程:文中通过一个具体的例子说明了当预测概率 y1​ 和 y2 发生变化时,两种损失函数的表现差异。特别地,当使用交叉熵作为损失函数时,即使在预测概率与真实标签相差较大的情况下,也能获得较大的梯度,从而使模型更容易通过梯度下降等优化方法找到最优解。

  5. 结论:由于均方误差在预测概率与真实标签相差较大时梯度非常小,这可能导致优化过程停滞不前。相比之下,交叉熵在这些情况下能够提供更大的梯度,有助于优化过程更顺利地进行。

实验:

把我破电脑给累坏了

代码详解

卷积神经网络是深度学习中的一个非常重要的分支,本作业提供了进行图像分类任务的基本范式。

  • 一、准备数据

  • 二、训练模型

  • 三、应用模型

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

  1. 导入所需要的库/工具包

  2. 数据准备与预处理

  3. 定义模型

  4. 定义损失函数和优化器等其他配置

  5. 训练模型

  6. 评估模型

  7. 进行预测

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

导入所需要的库/工具包

# 导入必要的库
import numpy as np
import pandas as pd
import torch
import os
import torch.nn as nn
import torchvision.transforms as transforms
from PIL import Image
# “ConcatDataset” 和 “Subset” 在进行半监督学习时可能是有用的。
from torch.utils.data import ConcatDataset, DataLoader, Subset, Dataset
from torchvision.datasets import DatasetFolder, VisionDataset
# 这个是用来显示进度条的。
from tqdm.auto import tqdm
import random

为了确保实验的可重复性,设置随机种子,并对CUDA进行配置以确保确定性:

# 设置随机种子以确保实验结果的可重复性
myseed = 6666

# 确保在使用CUDA时,卷积运算具有确定性,以增强实验结果的可重复性
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

# 为numpy和pytorch设置随机种子
np.random.seed(myseed)
torch.manual_seed(myseed)

# 如果使用CUDA,为所有GPU设置随机种子
if torch.cuda.is_available():
    torch.cuda.manual_seed_all(myseed)

数据准备与预处理

先下载个数据集。

LeeDL-HW3-CNN · 数据集 (modelscope.cn)

下载hw3_data.zip

定义模型

定义损失函数和优化器等其他配置

训练模型

评估模型

进行预测


 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值