## pytorch卷积层与池化层输出的尺寸的计算公式详解 要设计卷积神经网络的结构,必须匹配层与层之间的输入与输出的尺寸,这就需要较好的计算输出尺寸
卷积后,池化后尺寸计算公式:
(图像尺寸-卷积核尺寸 + 2填充值)/步长+1
(图像尺寸-池化窗尺寸 + 2填充值)/步长+1
上图翻译如下:
k,p,s是标量,n_out 与n_in的长宽对应
卷积神将网络的计算公式为:
k=3, p=1, s=1
n_out=(n_in + 2 *1 -3) / 1 + 1 = n_in
所以 k=3, p=1, s=1是不会改变输入尺寸的, 得到feature_map大小与输入大小一样
还有一组参数,也是不改变输出大小
k=5, p=2, s=1
n_out = (n_in + 2 * 2 - 5) / 1 + 1 = n_in
class CNN(nn.Module):
def __init__(self, in_channels = 1, num_classes = 10):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(in_channels=1, out_channels=8, kernel_size=3, stride=1, padding=1) #(8,28,28)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2) #(8, 14,14) padding 默认为0
self.conv2 = nn.Conv2d(in_channels=8, out_channels=16, kernel_size=3, stride=1, padding=1) #(16, 14,14)
self.fc1 = nn.Linear(16*7*7, num_classes) #全连接是7*7, 所以conv2后面还有一层pooling
def forward(self, x):
x = F.relu(self.conv1(x)) #(28,28)
x = self.pool(x) #(14,14)
x = F.relu(self.conv2(x)) #(14,14)
x = self.pool(x) #(7,7)
x = x.reshape(x.shape[0], -1)
x = self.fc1(x)
return x
x = (batch_size, 1, 28, 28)
网络定义不用管图片数据大小,只关注通道,这里为1,与模型in_channels定义能数值能对应起来。
卷积层中out_channels参数表示filter个数,一个filter相当于一个recept_field,一个filter扫过所有图片相当于守备同样区域的神经网络共享参数, filter数目可以任意指定。所以一个filer扫过一张图片得到一个feature_map, feature_map的大小就是上述公式求解。下一层网络通道数就是上一层输出通道数。所以卷积层和池化层之间可以不用关注feature_map大小,但是最后要将所有filter的feature_map拉长,最后统一计算全连接层的输入就是拉长后向量大小。