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])