Pytorch-卷积神经网络的运算流程(下)

  • 2019 年 11 月 20 日
  • 筆記

若进行打padding操作

layer = nn.Conv2d(1, 3, kernel_size=3, stride=1, padding=1)  # 1代表这里假设一张黑白图片,3代表kernel的数量,另外设置kernel size为3,步长为1  # padding为1  x = torch.rand(1, 1, 28, 28)  # 随机代入数据到x  out = layer.forward(x)  # 进行一次卷积的前向运算  print(out.size())  # 输出结果的size查看一下

此时输出结果为

torch.Size([1, 3, 28, 28])

当打补丁后,输出的size与原图片的size一致

若取不同步长时,也会对输出结果造成影响

layer = nn.Conv2d(1, 3, kernel_size=3, stride=2, padding=1)  # 1代表这里假设一张黑白图片,3代表kernel的数量,另外设置kernel size为3  # 步长这里为2  x = torch.rand(1, 1, 28, 28)  # 随机代入数据到x  out = layer.forward(x)  # 进行一次卷积的前向运算  print(out.size())  # 输出结果的size查看一下

此时步长取2的输出为

torch.Size([1, 3, 14, 14])

这种大跨越幅度的读取数据接收的信息量有所减少,进而达到一种降维的目的。

若想查看参数

layer = nn.Conv2d(1, 3, kernel_size=3, stride=2, padding=1)  # 1代表这里假设一张黑白图片,3代表kernel的数量,另外设置kernel size为3  # 步长这里为2  x = torch.rand(1, 1, 28, 28)  # 随机代入数据到x  out = layer.forward(x)  # 进行一次卷积的前向运算  # 输出层间的参数的size查看一下  print(layer.weight.size())

输出为

torch.Size([3, 1, 3, 3])

这里第一个3代表3个通道,input channel数量为之前的1,3 3 代表了所取的kernel的size。

layer = nn.Conv2d(1, 3, kernel_size=3, stride=2, padding=1)  # 1代表这里假设一张黑白图片,3代表kernel的数量,另外设置kernel size为3  # 步长这里为2  x = torch.rand(1, 1, 28, 28)  # 随机代入数据到x  out = layer.forward(x)  # 进行一次卷积的前向运算  # 同样可以输出bias进行查看  print(layer.bias.size())

结果为

torch.Size([3])

验证了之前所取的channel的数量

这里也有其他书写方法

import torch  import torch.nn as nn  import torch.nn.functional as F    w = torch.rand(16, 3, 5, 5)  # 设置观察的kernel数量为16,input channel为3,kernel size为5*5  b = torch.rand(16)  x = torch.rand(1, 1, 28, 28)    out = F.conv2d(x, w, b, stride=1, padding=1)    print(out.size())

此时输出会报错

Traceback (most recent call last):      out = F.conv2d(x, w, b, stride=1, padding=1)  RuntimeError: Given groups=1, weight of size 16 3 5 5, expected input[1, 1, 28, 28] to have 3 channels, but got 1 channels instead

报错原因在于input channel数量应该为3, 但所给出的x的input channel数量为1,数据不匹配。

将x数据进行修改即可

w = torch.rand(16, 3, 5, 5)  # 设置观察的kernel数量为16,input channel为3,kernel size为5*5  b = torch.rand(16)  x = torch.rand(1, 3, 28, 28)    out = F.conv2d(x, w, b, stride=1, padding=1)    print(out.size())

此时输出为

torch.Size([1, 16, 26, 26])

同样这里可以进行stride和padding的设置

w = torch.rand(16, 3, 5, 5)  # 设置观察的kernel数量为16,input channel为3,kernel size为5*5  b = torch.rand(16)  x = torch.rand(1, 3, 28, 28)    out = F.conv2d(x, w, b, stride=2, padding=2)    print(out.size())

输出为

torch.Size([1, 16, 14, 14])