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

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

这里写目录标题

    • 1. torch的tensor高级索引用法
    • 2. pytorch网络模型自定义初始化
    • 3. pytorch的Dataloader的num_workers是否并行
    • 关于数据集的概念

1. torch的tensor高级索引用法

  如果想要同时访问一个n维的tensor里的多个数据,可以像下面这样做:
李沐大神动手学深度学习——学习笔记(不定期连载)_第1张图片
  第三行索引就是高级用法,像是一个二维数组一样。y_hat是一个二维tensor,第三行的索引的第一个数组表示第一个维度的索引,同理,第二个数组就表示第二个维度的索引。如果y_hat是三维数组,同理,可以这样做:
李沐大神动手学深度学习——学习笔记(不定期连载)_第2张图片
  可以看到,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。

关于数据集的概念

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

你可能感兴趣的:(学习笔记,python,人工智能,深度学习)