动手学深度学习5.2 PyTorch教程 参数绑定

参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战


有时我们希望在多个层间共享参数。

如果层数少,我们可以设定其他层参数等于某一个层的参数。但是如果有很多层的时候怎么办呢?难道每一层都设置等于某一层的权重吗。

不了解卷积神经网络的在这里可能不太会理解为什么要用到共享。那也没关系,下一章就是讲卷积神经网络。将参数绑定放在这里讲就是为了下一章实现代码的时候方便。

在卷积神经网络中,卷积层可以减少参数,减少计算量,因为卷积层的参数共享特性。

先大致讲一下什么是卷积层计算过程。

image.png

当你输入一个矩阵的时候,不是矩阵和权重矩阵直接相乘了。

而是使用一个卷积核与其进行相乘,可以理解为进行局部运算。然后不断挪动,直到将整个图都计算完毕。

如下图所示,使用一个3×3的卷积核对一个5×5的矩阵进行计算。卷积核每次向右移一格,向右移不动之后向下移一格继续从最左边开始计算。直到挪完整张图。

右边的黑色格子就是卷积核和卷积核覆盖部分相乘,即两个3×3的矩阵相乘后相加得出来的值。

卷积核从最左上角开始,每次向右移一格,最多能计算三次,每次向下移一格,最多能计算三次,所以卷积层计算完毕之后是一个3×3的结果。

这个移动计算的过程中,卷积核的参数是固定的。也就是在卷积过程中都共享一个卷积核参数。

image.png

参数绑定

在学卷积神经网络之前那我们先学会什么是参数绑定

import torch
from torch import nn
复制代码
X = torch.rand(size=(5, 4))
shared = nn.Linear(8, 8)
net = nn.Sequential(nn.Linear(4, 8), 
                    nn.ReLU(),
                    shared, 
                    nn.ReLU(),
                    shared, 
                    nn.ReLU(),
                    nn.Linear(8, 1))
net(X)
复制代码
  • 生成测试数据X
  • 设置共享层
  • 定义网络
  • 调用网络处理X
# 检查参数是否相同
print(net[2].weight.data[0] == net[4].weight.data[0])

net[2].weight.data[0, 0] = 100
# 确保它们实际上是同一个对象,而不只是有相同的值。
print(net[2].weight.data[0] == net[4].weight.data[0])
复制代码
>>
tensor([True, True, True, True, True, True, True, True])
tensor([True, True, True, True, True, True, True, True])
复制代码
  • 先是检查参数是否相同。
  • 对第二层网络的权重进行更改。
  • 更改之后重新检查参数的情况,依旧相等。

可以确定第二层和第四层的参数是完全绑定的。


  1. 《动手学深度学习》系列更多可以看这里:《动手学深度学习》专栏(juejin.cn)

  2. 笔记Github地址:DeepLearningNotes/d2l(github.com)

还在更新中…………

おすすめ

転載: juejin.im/post/7032257087300173854