李沐大神动手学深度学习——学习笔记(不定期连载)

最近在看李沐大佬的动手学深度学习,讲的非常基础,从很基础的开始讲,很易懂,这里记一些在之前没碰到过的在他代码里出现过的写法,and一些问题,当做学习记录,不定期连载更新。

前12集

1. torch的tensor高级索引用法

  如果想要同时访问一个n维的tensor里的多个数据,可以像下面这样做:
在这里插入图片描述
  第三行索引就是高级用法,像是一个二维数组一样。y_hat是一个二维tensor,第三行的索引的第一个数组表示第一个维度的索引,同理,第二个数组就表示第二个维度的索引。如果y_hat是三维数组,同理,可以这样做:
在这里插入图片描述
  可以看到,y-hat是一个三维数组,索引时第一个数组表示第一个维度,第二个数组表示第二个维度,以此类推。

2. pytorch网络模型自定义初始化

  设计好了一个pytorch网络模型,需要初始化它的权重,如果想对其中不同的类型的层统一用不同的初始化方法,就可以自定义一个初始化方法对不同层做不同的初始化,例如对线性层用正态分布初始化,对卷积层做方差不同的正态分布初始化等等。

import torch.nn as nn
net = nn.Sequential(nn.Flatten(),
                    nn.Linear(784, 10),
                    nn.Linear(10, 100),
                    nn.Linear(100, 10),
                    nn.Conv2d(3, 64, 3, 1))

def init_weights(m):
    type_m = type(m)
    if type_m == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)
    elif type_m == nn.Conv2d:
        nn.init.normal_(m.weight, mean=1, std = 0.1)
    else:
        nn.init.normal_(m.weight, mean=0, std = 2)

net.apply(init_weights)
# 输出第二层线性层的参数
print(net[1].weight)	
Parameter containing:
tensor([[ 0.0144, -0.0138,  0.0018,  ..., -0.0047, -0.0086,  0.0111],
        [ 0.0057, -0.0093,  0.0175,  ...,  0.0025,  0.0081, -0.0197],
        [ 0.0030, -0.0007, -0.0065,  ..., -0.0049, -0.0170,  0.0015],
        ...,
        [ 0.0063,  0.0019, -0.0048,  ..., -0.0040, -0.0133, -0.0035],
        [ 0.0085, -0.0043,  0.0065,  ..., -0.0035,  0.0087, -0.0062],
        [-0.0205, -0.0106,  0.0139,  ..., -0.0090,  0.0171,  0.0072]],
       requires_grad=True)

3. pytorch的Dataloader的num_workers是否并行

  这个问题当初也困扰了我一段时间,现在可以肯定的是num_workers个Dataloader是并行的,多个worker也就是实现了“预取”的功能,例如设置其为4,那么pytorch就会开4个dataloader进程,并行的读4个batch_size的数据放到内存中,如果GPU够快,那它算得肯定比workers读的要快(GPU带宽等也要够快),所以在空间足够的情况下,num_workers越多肯定越好。可以在任务管理器中看到开启的多个python进程,也就是dataloader。

4. 关于数据集的概念

  • 训练数据集:用来训练模型的参数
  • 验证数据集:用来选择模型的超参数
  • 在非大数据集上通常用k折交叉验证
  • k折交叉验证是指将数据集划分为k个部分,每次拿其中一部分作为验证集,其余作为训练集,重复k次,通常选择k=5或k=10.

————————————12.29更新——————————————————

13集——丢弃法

一句话总结,丢弃法的丢弃不是字面上的把神经元直接去掉,而是将某些神经元置零。

  一个好的模型需要对输入数据的扰动鲁棒——在层之间添加噪音

-通常作用在隐藏全连接层输出上。
-从效果上来看,类似于一个正则项,只在训练中用,推理时直接返回输入。
-将一些输出项随机置零来控制模型复杂度,丢弃概率是超参数。
-训练时每个batch都会丢一次
-卷积层不会用到丢弃法

14集——数值稳定性,模型初始化,激活函数

数值稳定性

  • 梯度爆炸:对多层的梯度累乘,可能导致梯度最后会很大,超出值域。
  • 梯度消失:同理,如果梯度值很小,经过多层的累乘之后,梯度会变得很小,接近0. 常见于sigmoid激活函数(不过这个函数现在都很少用了)
    • 梯度爆炸的问题:
      • 值超出值域
      • 对学习率敏感,学习率大-》大参数值-》更大梯度
      • 学习率小-》训练无进展
    • 梯度消失的问题:
      • 梯度值变为0
      • 训练无进展,
      • 网络较深时,仅顶层网络较好,底部层很差。

模型初始化

  • 让训练更稳定——让梯度值在合理范围里

    • 将乘法变成加法,如ResNet,LSTM
    • 合理的权重初始化和激活函数
  • 让每层的方差是一个常数

  • 权重初始化

    • 在合理值区间里随机初始参数,使得其能更快的到最优解附近
    • 对小一点的网络可以用正态分布来初始,
  • Xavier初始:利用每层的大小来做正态分布或者均匀分布的参数,来初始化某一层,具体略

QA

输出或者参数不是符合正态分布才有利于学习,而是要在一个范围内就可以,只是符合正态分布的话方便计算。

-——待续。。。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值