若进行打padding操作
代码语言:javascript复制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查看一下
此时输出结果为
代码语言:javascript复制torch.Size([1, 3, 28, 28])
当打补丁后,输出的size与原图片的size一致
若取不同步长时,也会对输出结果造成影响
代码语言:javascript复制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的输出为
代码语言:javascript复制torch.Size([1, 3, 14, 14])
这种大跨越幅度的读取数据接收的信息量有所减少,进而达到一种降维的目的。
若想查看参数
代码语言:javascript复制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())
输出为
代码语言:javascript复制torch.Size([3, 1, 3, 3])
这里第一个3代表3个通道,input channel数量为之前的1,3 3 代表了所取的kernel的size。
代码语言:javascript复制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())
结果为
代码语言:javascript复制torch.Size([3])
验证了之前所取的channel的数量
这里也有其他书写方法
代码语言:javascript复制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())
此时输出会报错
代码语言:javascript复制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数据进行修改即可
代码语言:javascript复制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())
此时输出为
代码语言:javascript复制torch.Size([1, 16, 26, 26])
同样这里可以进行stride和padding的设置
代码语言:javascript复制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())
输出为
代码语言:javascript复制torch.Size([1, 16, 14, 14])