卷积神经网络feature大小及参数量计算


前言


1.卷积后的大小:

W:矩阵宽,H:矩阵高,F:卷积核宽和高,P:padding(需要填充的0的个数),N:卷积核的个数,S:步长

width:卷积后输出矩阵的宽,height:卷积后输出矩阵的高
width = (W - F + 2P)/ S + 1(向下取整)
height = (H - F + 2P) / S + 1(向下取整)

当conv2d(), max_pool() 中的 padding=SAME时,width=W,height=H,则保证输入输出尺寸图片大小相等,当padding=‘valid’时,P=0,相当于不填充~~
输出图像大小:(width,height,N)其中N代表的卷积核的个数就是在卷积操作中起到的分为N个通道数的作用

当卷积操作中含有膨胀因子d:

当卷积操作中含有膨胀因子d,且padding=pad,k为卷积核尺寸,stride为步长时:

out = (W - (F* d-1)+2* pad)/ S + 1(W、H相同)

2.池化后的大小:

width = (W - F)/ S + 1(向下取整)
height = (H - F) / S + 1(向下取整)

代码如下(示例):

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchsummary import summary

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # PyTorch v0.4.0
model = Net().to(device)

summary(model, (1, 28, 28))
# summary(model, (1, 56, 56))
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1           [-1, 10, 24, 24] =28-5+1            260 = (5x5+1)x10
            Conv2d-2             [-1, 20, 8, 8]           5,020
         Dropout2d-3             [-1, 20, 8, 8]               0
            Linear-4                   [-1, 50]          16,050
            Linear-5                   [-1, 10]             510
               Net-6                   [-1, 10]               0
================================================================
Total params: 21,840
Trainable params: 21,840
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.06
Params size (MB): 0.00
Estimated Total Size (MB): 0.00
----------------------------------------------------------------

在这里插入图片描述
⭐在深度学习中,可能对特征图的计算,tensorflow和pytorch的padding计算不同。

  1. 在tensorflow中:如果你想要输出等于输入,padding="SAME"即可,如果你想要输出别的尺寸的特征图,使用padding=‘VALID’,conv2d会自动计算输出特征图大小。
  2. 在pytorch中:pytorch里面没有same和valid,所以你想要保持输出等于输入,要利用pad=t,t为填充尺寸,以保持输入输出特征图相等。

3.上采样UpSampling2D
上采样相当于放大多少倍,size=倍数,
在这里插入图片描述
卷积操作:
stride=[1,1,1,1]时:
padding=‘SAME’,卷积操作后图片大小不变
padding=‘VALID’,output_height=output_width = (W – F + 1) / S (结果向上取整)

stride≠[1,1,1,1]时:
padding=‘SAME’,output_height = output_width = W / S (结果向上取整)
padding=‘VALID’,output_height=output_width = (W – F + 1) / S (结果向上取整)

池化操作:
池化层通常以卷积层为输入,故此处的W和H分别为卷积层输出的featuremap的宽或者高,F为池化时的ksize的大小,S仍为步长
stride≠[1,1,1,1]时:
padding='SAME’时,output_height = output_width = W / S或者H / S (结果向上取整)
padding='VALID’时,output_height=output_width = (W – F + 1) / S (结果向上取整)

stride=[1,1,1,1]时:
padding='SAME’时,池化后featuremap大小不变,output_width =
W,output_height = H
padding=‘VALID’,output_height=output_width = (W – F + 1) / S (结果向上取整)
在这里插入图片描述

卷积输出尺寸进一步说明:
在这里插入图片描述

参数含义:
n:特征图的宽或者高
k:卷积核的尺寸
p:padding的数值,一般指单侧填充几个单元
stride:步长

转置卷积输出尺寸:
转置卷积俗称反卷积,但正规叫法是转置卷积。是上采样方式中的一种。
转置卷积用来增大特征图的分辨率的。
在这里插入图片描述

上采样方式:
1.插值法
2.反池化
3.反卷积

通常的上采样方式:卷积池化


总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【网络星空】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值