块与其层的存储
Module
添加子模块时将其存到了一个有序字典里(而不是列表),是为了存键值对后遍历(如初始化参数等时)能快速访问模块
参数管理
- 可以通过如
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1))
X = torch.rand(size=(2, 4))
net(X)
print(net[2].state_dict())
来获得某一层的所有参数情况,形如:
OrderedDict([('weight',
tensor([[-0.2359, 0.1440, 0.1914, 0.2999, -0.2030, -0.2770, 0.0725, 0.2570]])),
('bias', tensor([-0.0155]))])
事实上torch中每个参数是一参数类的一个实例的形式存在的
其包含了值、梯度和一些其它额外信息
而具体某个参数可以通过进一步操作得到:
print(type(net[2].bias))
print(net[2].bias)
print(net[2].bias.data)
net[2].weight.grad
<class 'torch.nn.parameter.Parameter'>
Parameter containing:
tensor([-0.0155], requires_grad=True)
tensor([-0.0155])
None #因为还没调用backward
直接设定参数也是可行的
net[0].weight.data[:] += 1
net[0].weight.data[0, 0] = 42
net[0].weight.data[0]
可以将一个层对象反复加到一个块里来实现共享参数的效果(参量会同步改变)
shared = nn.Linear(8, 8)
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(),
shared, nn.ReLU(),
shared, nn.ReLU(),
nn.Linear(8, 1))
书给出的一些好处: 对于图像识别中的CNN,共享参数使网络能够在图像中的任何地方而不是仅在某个区域中查找给定的功能。 对于RNN,它在序列的各个时间步之间共享参数,因此可以很好地推广到不同序列长度的示例。
感觉像是某个移动算子(如fileter)的一种模拟移动效果的实现方式?
参数存储与加载
torch.save(net.state_dict(), 'mlp.params')
clone = MyLayer()
clone.load_state_dict(torch.load('mlp.params'))
clone.eval()
这是可行且必要的。而参数会以参数字典形式加载
但建议架构还是用代码实现,其用文件保存、加载可能存在一些问题或麻烦
GPU初见
- 可以通过notebook中执行
!nvidia-smi
来获得GPU信息
说些什么吧!