MENU

Pytorch 定义 Conv Layer

January 9, 2020 • Read: 4159 • Deep Learning阅读设置

卷积的讲解可以看我的这篇文章 CS231n 笔记:通俗理解 CNN

下面主要讲解一下如何用 pytorch 定义卷积层

  • # 卷积神经网络的编写要用到nn.Conv2d
  • # 该API意为进行2D的函数卷积层计算
  • import torch
  • import torch.nn as nn
  • layer = nn.Conv2d(1, 5, kernel_size=3, stride=1, padding=0)
  • # 1代表每个kernel的channel是1,5代表kernel的数量,同时也是输出到下一层的channel数量
  • x = torch.rand(1, 1, 28, 28) # 1张图片,1channel,28*28
  • out = layer.forward(x)
  • print(out.shape)
  • print(layer.weight.size())
  • print(layer.bias.size())

输出

  • torch.Size([1, 5, 26, 26])
  • torch.Size([5, 1, 3, 3])
  • torch.Size([5])

这里可能需要解释一下 weight 的 size,首先第一值 5 是 kernel 的数量,也是下一层的 channel 数量,第二个值 1 是 input 的 channel 数量,3 和 3 表示 kernel 的长宽

需要注意,kernel 的 channel 必须与 input 图片的 channel 相等,否则会报错,例如定义一个 RGB 三通道的输入图片,但是 kernel 的 channel 不是 3 就会报错,见下面的代码

  • layer = nn.Conv2d(2, 5, kernel_size=3, stride=1, padding=0)
  • # 2代表每个kernel的channel是2
  • x = torch.rand(1, 3, 28, 28) # 1张图片,3channel,28*28
  • # 由于输入图片的channel是3,而kernel的channel是2,两者不等,所以会报错

除此之外,pytorch 还有一种定义卷积神经网络的方法

  • import torch.nn.functional as F
  • x = torch.rand(1, 1, 28, 28)
  • weight = torch.rand(16, 3, 5, 5)
  • b = torch.randn(16)
  • out = F.conv2d(x, weight, b, stride=1, padding=1)

当然,上面的写法肯定会报错的,因为我们前面说了,weight 的参数分别是 kernel 的数量、输入图片的 channel,以及 kernel 的长宽。因为 weight 中制定输入图片的 channel 是 3,因此 x 的 channel 必须是 3,但是我们定义 x 的 channel 是 1,它们发生了矛盾,所以报错了,把 x 重新定义为 3 通道 x = torch.rand(1, 3, 28, 28),或者把 weight 的 3 改成 1 即可 weight = torch.rand(16, 1, 5, 5)

Archives Tip
QR Code for this page
Tipping QR Code