图片经卷积或池化后尺寸大小计算
创始人
2025-06-01 12:29:28
0

1. 卷积

卷积层的作用是提取输入图片中的信息,这些信息被称为图像特征,这些特征是由图像中的每个像素通过组合或者独立的方式所体现,比如图片的纹理特征,颜色特征。

卷积层有很多卷积核,通过做越来越多的卷积,提取到的图像特征会越来越抽象。

# 此方法中有初始化的卷积核,因此只需要指定卷积核大小即可,不需要管其中内容
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
  • in_channels:参数代表输入特征矩阵的深度即channel,比如输入一张RGB彩色图像,那in_channels=3

  • out_channels:参数代表卷积核的个数,使用n个卷积核输出的特征矩阵深度即channel就是n

  • kernel_size:参数代表卷积核的尺寸,输入可以是int类型如3,代表卷积核的height=width=3,也可以是tuple类型如(3, 5)代表卷积核的height=3,width=5

  • stride:参数代表卷积核的步距,默认为1,和kernel_size一样输入可以是int类型,也可以是tuple类型【传入若为(2,3),即卷积核每次向右移动2格,右边不够位后回到起点向下移动3格重新开始】

    image-20230320205639210
  • padding:参数代表在输入特征矩阵四周补零的情况默认为0【上图👆就在外围补了一圈0】,同样输入可以为int型如1代表上下方向各补一行0元素,左右方向各补一列0像素

    如果输入为tuple型如(2, 1)代表在上方补2行下方补2行,左边补1列,右边补1列。padding[0]是在H高度方向两侧填充,padding[1]是在W宽度方向两侧填充

  • bias:参数表示是否使用偏置,默认使用

  • 其余参数较少使用,此处省略

1.1 张量卷积后的尺寸

在卷积操作过程中,我们知道矩阵经卷积操作后的尺寸由以下👇几个因素决定:

  • 输入图片的大小 W×WW \times WW×W

    若大小为H×WH \times WH×W,则用下边公式👇分别计算得到新的HW,二者相乘为矩阵尺寸N

  • 卷积核kernel_size大小 K×KK \times KK×K

  • 步长stride大小S

  • 填充padding大小P

矩阵尺寸 N=⌊W−K+2PS⌋+1如下代码经过卷积得到的矩阵尺寸为N=⌊5−2+2×12⌋+1=3矩阵尺寸\ N = \left \lfloor \dfrac{W − K + 2P }{S} \right \rfloor + 1\\ \\ 如下代码经过卷积得到的矩阵尺寸为N = \left \lfloor \dfrac{5 − 2 + 2\times 1 }{2} \right \rfloor + 1=3 矩阵尺寸 N=⌊SW−K+2P​⌋+1如下代码经过卷积得到的矩阵尺寸为N=⌊25−2+2×1​⌋+1=3

import torch
import torch.nn as nn
# 利用标准正态分布填充
# 四维分别对应:(batch_size,channel,H,W)
im = torch.randn(1, 1, 5, 5)
c = nn.Conv2d(in_channels=1, out_channels=1,kernel_size=2, stride=2, padding=1)
output = c(im)
print("原(1,1,5,5)张量:")
print(im)
print("经卷积处理后的张量:")
print(output)
image-20230321182032893

1.2 对 channel 的理解

具体可看此博客👉:理解卷积神经网络中的通道channel

  1. 最初输入的图片样本的 channels ,即in_channels,取决于图片类型,比如RGB图像作为输入时channels=3

  2. 卷积操作完成后输出的 out_channels ,取决于卷积核【可以理解为每个卷积核通过计算会得到 “一层” 结果,层数即为通道数】的数量。此时的 out_channels 也会作为下一次卷积时的卷积核的 in_channels

    image-20230321190009046

多层的卷积核叫做过滤器

  • 卷积核就是由长和宽来指定的,是一个二维的概念
  • 过滤器是是由长、宽和深度指定的,是一个三维的概念
  • 过滤器可以看做是卷积核的集合
  • 过滤器比卷积核高一个维度,即深度

2. 池化

池化层的作用是对卷积层中提取的特征进行挑选

常见的池化操作有最大池化和平均池化,池化层是由 n×nn\times nn×n 大小的矩阵窗口滑动来进行计算的,类似于卷积层,只不过不是做互相关运算,而是求 n×nn\times nn×n 大小的矩阵中的最大值、平均值等

image-20230321191604311

池化层主要有以下👇几个作用:

  1. 挑选不受位置干扰的图像信息
  2. 对特征进行降维【但是不变通道数】,提高后续特征的感受野,也就是让池化后的一个像素对应前面图片中的一个区域
  3. 池化层是不进行反向传播的,而且池化层减少了特征图的变量个数,因此池化层可以减少计算量

池化后图片尺寸

  • 输入图像尺寸为WxH
  • 卷积核kernel_size的尺寸FxF
  • 步长stride的大小S
  • 池化一般不使用填充padding【如果传入参数使用了padding参数,则理解为输入图像WH多了 2×padding2\times padding2×padding 即可】

W=⌊W−FS+1⌋H=⌊H−FS+1⌋\begin{aligned} W & =\left \lfloor \frac{W-F}{S}+1 \right \rfloor \\ H & =\left \lfloor \frac{\mathrm{H}-\mathrm{F}}{\mathrm{S}}+1 \right \rfloor \end{aligned} WH​=⌊SW−F​+1⌋=⌊SH−F​+1⌋​

池化不改变通道数,因此若输入图像通道数为D,则经过池化后通道数仍然为D

import torch
import torch.nn as nn
# 四维分别对应:(batch_size,channel,H,W)
im = torch.randn(1, 64, 112, 112)
# 卷积核为3*3,步长为2,上下左右各填充1行
# 原图像W=H=112,由于padding=1,因此最后图像大小应为W=H= 112 + 2*1 =114
# 代入公式时 W= H= 114
c = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
output = c(im)
print("原张量尺寸:")
print(im.shape)
print("经最大池化处理后的张量尺寸:")
print(output.shape)

image-20230322120645756

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...