最近在看李沐大佬的动手学深度学习,讲的非常基础,从很基础的开始讲,很易懂,这里记一些在之前没碰到过的在他代码里出现过的写法,and一些问题,当做学习记录,不定期连载更新。
如果想要同时访问一个n维的tensor里的多个数据,可以像下面这样做:
第三行索引就是高级用法,像是一个二维数组一样。y_hat是一个二维tensor,第三行的索引的第一个数组表示第一个维度的索引,同理,第二个数组就表示第二个维度的索引。如果y_hat是三维数组,同理,可以这样做:
可以看到,y-hat是一个三维数组,索引时第一个数组表示第一个维度,第二个数组表示第二个维度,以此类推。
设计好了一个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)
这个问题当初也困扰了我一段时间,现在可以肯定的是num_workers个Dataloader是并行的,多个worker也就是实现了“预取”的功能,例如设置其为4,那么pytorch就会开4个dataloader进程,并行的读4个batch_size的数据放到内存中,如果GPU够快,那它算得肯定比workers读的要快(GPU带宽等也要够快),所以在空间足够的情况下,num_workers越多肯定越好。可以在任务管理器中看到开启的多个python进程,也就是dataloader。