cnn网络conv输出feature_map的大小计算公式

## 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拉长,最后统一计算全连接层的输入就是拉长后向量大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个基于PyTorch的卷积神经网络CNN),下面是代码的详细解释和网络结构的说明: ```python import torch.nn as nn class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1, padding=1) self.relu1 = nn.ReLU() self.maxpool1 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1) self.relu2 = nn.ReLU() self.maxpool2 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv3 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1) self.relu3 = nn.ReLU() self.maxpool3 = nn.MaxPool2d(kernel_size=2, stride=2) self.fc1 = nn.Linear(in_features=4*4*128, out_features=1024) self.relu4 = nn.ReLU() self.fc2 = nn.Linear(in_features=1024, out_features=10) def forward(self, x): x = self.conv1(x) x = self.relu1(x) x = self.maxpool1(x) x = self.conv2(x) x = self.relu2(x) x = self.maxpool2(x) x = self.conv3(x) x = self.relu3(x) x = self.maxpool3(x) x = x.view(-1, 4*4*128) x = self.fc1(x) x = self.relu4(x) x = self.fc2(x) return x ``` 该网络结构分为两个部分:卷积层和全连接层。 卷积层的结构为:Conv2D -> ReLU -> MaxPool2D,其中每个卷积层都包含一个卷积层(Conv2D)、一个激活函数(ReLU)和一个最大池化层(MaxPool2D)。这三个层共同组成了一个卷积层。 - Conv2D:该层是卷积操作,接收一个输入张量和卷积核(filter),输出一个特征图(feature map)。该卷积层有3个参数:in_channels 表示输入张量的通道数,out_channels 表示输出特征图的通道数,kernel_size 表示卷积核的大小。 - ReLU:该层是激活函数,将卷积输出的结果进行非线性变换,增加模型的非线性拟合能力。 - MaxPool2D:该层是池化层,用于对卷积输出的特征图进行下采样,减少特征图的大小,同时保留最重要的特征。 全连接层的结构为:Linear -> ReLU -> Linear,其中包含两个全连接层。全连接层将卷积层的输出展开为一维张量,然后进行线性变换,最后输出分类的结果。 - Linear:该层是全连接操作,将输入张量与权重矩阵相乘,并加上偏置项,输出一个一维张量。该全连接层有2个参数:in_features 表示输入张量的大小,out_features 表示输出张量的大小。 - ReLU:该层是激活函数,将全连接层输出的结果进行非线性变换,增加模型的非线性拟合能力。 对于该模型的输入,它期望一个3通道、32x32像素大小的图像。输出为10个类别的概率分布,表示输入图像属于哪个类别。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值