动手学深度学习PyTorch版-task6

目录:

task1:https://blog.csdn.net/zahidzqj/article/details/104293563

task2:https://blog.csdn.net/zahidzqj/article/details/104309590

task3:https://blog.csdn.net/zahidzqj/article/details/104319328

task4:https://blog.csdn.net/zahidzqj/article/details/104324196

task5:https://blog.csdn.net/zahidzqj/article/details/104324349

task6:本章节

task8:https://blog.csdn.net/zahidzqj/article/details/104452274

task9:https://blog.csdn.net/zahidzqj/article/details/104452480

task10:https://blog.csdn.net/zahidzqj/article/details/104478668

1 批量归一化和残差网络

主要包括:批量归一化、ResNets、DenseNet

批量归一化(BatchNormalization)

网络训练过程中参数不断改变导致后续每一层输入的分布也发生变化,而学习的过程又要使每一层适应输入的分布,因此我们不得不降低学习率、小心地初始化。

中心化(又叫零均值化):是指变量减去它的均值。其实就是一个平移的过程,平移后所有数据的中心是(0,0)。

 标准化(又叫归一化): 是指数值减去均值,再除以标准差。

目的:通过中心化和标准化处理,最终得到均值为0,标准差为1的服从标准正态分布的数据。

数据归一化方法很简单,就是要让数据具有0均值和单位方差,如下式:

BN增加了2个参数,用来保持模型的表达能力。于是最后的输出为:

对卷积层做批量归⼀化
位置:卷积计算之后、应⽤激活函数之前。
如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉伸和偏移参数。
计算:对单通道,batchsize=m,卷积计算输出=pxq
对该通道中m×p×q个元素同时做批量归一化,使用相同的均值和方差。

预测时的批量归⼀化
训练:以batch为单位,对每个batch计算均值和方差。
预测:用移动平均估算整个训练数据集的样本均值和方差。
 

残差网络ResNets

深度学习的问题:深度CNN网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,准确率也变得更差。

残差块(Residual Block)
恒等映射:
左边(普通神经网络):f(x)=x
右边(引入残差块):f(x)-x=0 (易于捕捉恒等映射的细微波动)

在残差块中,输⼊可通过跨层的数据线路更快地向前传播。
 

稠密连接网络(DenseNet)

主要构建模块:

稠密块(dense block): 定义了输入和输出是如何连结的。
过渡层(transition layer):用来控制通道数,使之不过大

其中过渡层组成:    1×1卷积层:来减小通道数
                                步幅为2的平均池化层:减半高和宽

习题:

nn.BatchNorm2d(6)的含义是:卷积层的批量归一化,通道数为6

BN层描述错误的是:拉伸参数和偏移参数均为超参数。

ResNet描述错误的是:可以通过不断加深网络层数来提高分类性能。

稠密连接网络过渡层中,1*1卷积层的主要作用是减小通道数

在稠密块中,假设由3个输出通道数为8的卷积层组成,稠密块的输入通道数是3,那么稠密块的输出通道数是:

计算公式: in_channels + i * out_channels=3*8+3=27

2 凸优化

本节主要是给出并证明了凸函数和凸集合的相关概念以及一些性质。

尽管优化方法可以最小化深度学习中的损失函数值,但本质上优化方法达到的目标与深度学习的目标并不相同。

优化方法目标:训练集损失函数值
深度学习目标:测试集损失函数值(泛化性)

优化在深度学习中的挑战
1)局部最小值
2)鞍点
3)梯度消失

首先是局部最小值问题:

å¨è¿éæå¥å¾çæè¿°

如图,对于这样的函数,存在一个局部最小值,当模型从最左面开始进行梯度下降时,达到局部最小值后梯度为0就停止优化了,但显然距离全局最小值还有一定的距离,也就是说损失函数因为局部最小值的问题没有达到最优。
 

鞍点:

在一个方向上是极大值,另一个方向是极小值点,一阶导都是为0,但是二阶导有正有负。

凸性 (Convexity):集合中两点连线,连线部分都在集合内,那就是凸函数。

规律:凸集合的交集为凸集合,并集不一定是。

凸函数:

Jensen 不等式:

注意:函数值的期望大于期望的函数值

性质

  1. 无局部极小值
  2. 与凸集的关系
  3. 二阶条件

凸函数与二阶导数:

限制条件:
1)拉格朗日乘子法
2)惩罚项
3)投影

 

3 梯度下降

一维梯度下降

证明:沿梯度反方向移动自变量可以减小函数值

 

#eg:f(x)=x^2
#定义原函数
def f(x):
    return x**2  # Objective function
#定义一阶导数
def gradf(x):
    return 2 * x  # Its derivative
#更新x
def gd(eta):
    x = 10
    results = [x]
    for i in range(10):
        x -= eta * gradf(x)
        results.append(x)
    print('epoch 10, x:', x)
    return results

#设置不同的学习率0.2  0.05  1.1
res = gd(0.2)#gd(0.05)  gd(1.1)

def show_trace(res):
    n = max(abs(min(res)), abs(max(res)))
    f_line = np.arange(-n, n, 0.01)
    d2l.set_figsize((3.5, 2.5))
    d2l.plt.plot(f_line, [f(x) for x in f_line],'-')
    d2l.plt.plot(res, [f(x) for x in res],'-o')
    d2l.plt.xlabel('x')
    d2l.plt.ylabel('f(x)')
    

show_trace(res)

修改不同的学习率,梯度衰减的速度不同,函数收敛的情况也不同。

在更新梯度的过程中容易陷入局部最小值,无法达到全局最优。

 

多维梯度下降

#eg:f(x)=x1^2+x2^2
eta = 0.1

def f_2d(x1, x2):  # 目标函数
    return x1 ** 2 + 2 * x2 ** 2

def gd_2d(x1, x2):
    return (x1 - eta * 2 * x1, x2 - eta * 4 * x2)

show_trace_2d(f_2d, train_2d(gd_2d))

自适应方法:牛顿法

c = 0.5

def f(x):
    return np.cosh(c * x)  # Objective

def gradf(x):
    return c * np.sinh(c * x)  # Derivative

def hessf(x):
    return c**2 * np.cosh(c * x)  # Hessian

# Hide learning rate for now
def newton(eta=1):
    x = 10
    results = [x]
    for i in range(10):
        x -= eta * gradf(x) / hessf(x)
        results.append(x)
    print('epoch 10, x:', x)
    return results

show_trace(newton())

随机梯度下降

随机梯度下降参数更新:

总结:

梯度下降:是沿梯度反方向移动自变量从而减小函数值,学习率设置要合理,而且局部极小值是梯度下降算法面临的一个挑战。

牛顿法:可以通过Hessian矩阵来调整“步幅”,解决局部极小值,但是不能避免这么问题,由于求Hessian矩阵的逆,计算量比较大。

对于n个样本,使用随机梯度下降更新一次的时间复杂度为O(n),一个的时间复杂度为:O(1),随样本数量线性增长。

梯度下降、随机梯度下降和小批量随机梯度下降可根据参数batch_size修改来实现。

未完待续。。。

为了在GPU上搭建动手深度学习pytorch环境,你需要按照以下步骤进行操作。 首先,你需要安装Anaconda来管理你的Python环境。你可以从官方网站 https://www.anaconda.com/ 下载适用于你操作系统的Anaconda安装程序。安装完成后,你可以使用conda命令创建一个新的环境。 接下来,你需要安装CUDA。CUDA是用于支持GPU计算的NVIDIA的并行计算平台和API模型。你可以从NVIDIA的官方网站下载适用于你的显卡型号的CUDA安装程序进行安装。 然后,你需要安装CUDNN。CUDNN是一个针对深度神经网络加速的GPU库。你可以从NVIDIA的开发者网站下载CUDNN并按照安装说明进行安装。 接下来,你可以使用conda命令来安装pytorch。你可以复制以下命令,在新建的环境输入: ``` conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch ``` 安装完成后,你可以在命令行输入python进入Python解释器环境,并导入torch模来测试pytorch的安装。你可以使用以下代码进行测试: ```python import torch from __future__ import print_function x = torch.rand(5, 3) print(x) print(torch.cuda.is_available()) # 测试CUDA是否可用 ``` 这样,你就成功搭建了动手深度学习pytorch环境,并且可以在GPU上进行深度学习任务了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [01 动手深度学习-配置环境pytorch](https://blog.csdn.net/qq_44653420/article/details/123883400)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值