三分钟完全了解PyTorch中卷积层内部计算方法和权值初始值的来历,让你对模型有更深层次的理解
首先先说明第一个答案,也就是PyTorch中卷积层的计算方法,其实这点很多人可能在书上已经看过图了,我只是用代码复现一遍
我们把所有变量都明确,首先是输入变量,我们设为2 * 2的全1矩阵,如下:
然后初始化一个二维卷积层,并输出其weight和bias,如下:
我们可以看到,weight和bias都有两个值,这是因为我们定义了输出通道为2,所以给我们分配了两个卷积核,然后可以看到权值分别为0.7843和0.51,bias分别为0.7589和0.4449,然后我们把input输出进去看看输出值,如下图:
输出的为两个22的tensor,我来解释一下它们怎么来的,首先两个tensor还是因为我们定义的输出通道为2,如果是图片的话,就会输出两张卷积过后的图片(是不是非常熟悉),然后0.154 = 0.7843(weight) 1 + 0.7589(bias),后面的同理,四个都一样是因为卷积核是1*1大小的,具体的计算方法理解了可以套到更大size的卷积核中。
这是第一点,计算方法跟逻辑回归很像,不难理解,一直让我弄不懂的是另外一个问题,那就是weight和bias是怎么来的?是PyTorch固定分配的?我查阅了很多资料,最后才找到答案:通过一个公式再加上这两个步骤随机生成的
先看PyTorch给出的计算公式,其实会很懵,懵的话没关系,我们直接看更下面的源码:
源码:
我们来根据上面我们的例子计算一下,n = in_channels,那我们的n就等于1,因为我们的输入维度是1 * 1 * 2 * 2,这里第一个值是batchsize,也就是你输入了多少个input,第二个就是我们的输入通道,ok,看下一步,我们的kernel_size为1,所以n乘到最后还是等于1,sqrt(1)等于1(开平方根),所以stdv还是等于1。。。。
ok然后就是初始化了,可以看到weight和bias都是初始化为-1到1之间的随机数,如下: