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

2019-11-20 14:20:20 浏览数 (1)

若进行打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])

0 人点赞