卷积和池化操作对图片尺寸改变

卷积操作

对于输入图像尺寸为 N w ∗ N h N_w * N_h NwNh,图片通道数为C,那么 j假设卷积核尺寸为FxF,通道数也为C 步幅为S,Padding使用P,经过该卷积层后输出的图像尺寸为WxH:

图片宽度

W = ⌊ N w + 2 P − F S + 1 ⌋ W=\left \lfloor \frac{N_w+2P-F}{S} +1 \right \rfloor W=SNw+2PF+1
图片长度
H = ⌊ N h + 2 P − F S + 1 ⌋ H=\left \lfloor \frac{N_h+2P-F}{S} +1 \right \rfloor H=SNh+2PF+1

假设卷积核的个数为 T,那么之后输出图片大小为 W ∗ H W*H WH ,通道数为T

具体过程可以参考下面的吴恩达教授的关于卷积神经网络的教程
教程链接:https://mooc.study.163.com/course/2001281004#/info
在这里插入图片描述
最近碰到的总是TF中的参数问题,其中一个padding的参数值设置觉得比较重要。tf中padding提供两种填充方式:VALID和SAME。

对于VALID,就是不填充,进行卷积,再除以步长,输出的形状计算如下:
W = ⌊ W − F S + 1 ⌋ W=\left \lfloor \frac{W-F}{S} +1 \right \rfloor W=SWF+1

对于SAME,即卷积之后填充,仅仅除以步长,输出的形状计算如下:

W = ⌊ W S + 1 ⌋ W=\left \lfloor \frac{W}{S} +1 \right \rfloor W=SW+1

池化操作

对于输入图像尺寸为 W ∗ H W * H WH,图片通道数为C,那么 假设池化核尺寸为FxF,通道数也为C 步幅为S,Padding使用P,经过池化后输出的图像尺寸为WxH:
公式和池化操作一样

图片宽度

W = ⌊ W + 2 P − F S + 1 ⌋ W=\left \lfloor \frac{W+2P-F}{S} +1 \right \rfloor W=SW+2PF+1
图片高度
H = ⌊ H + 2 P − F S + 1 ⌋ H=\left \lfloor \frac{H+2P-F}{S} +1 \right \rfloor H=SH+2PF+1


在这里插入图片描述
但,一般来说,池化操作的步长等于池化核的尺寸,而且池化一般不进行填充,所以公式

图片宽度
W = ⌊ W − F F + 1 ⌋ W=\left \lfloor \frac{W-F}{F} +1 \right \rfloor W=FWF+1
图片高度
H = ⌊ H − F F + 1 ⌋ H=\left \lfloor \frac{H-F}{F} +1 \right \rfloor H=FHF+1

举例:

当进行池化操作时,步长S就等于池化核的尺寸,如输入为30x30,池化核为5x5,则输出为
30 − 5 5 + 1 = 6 \frac{30-5}{5}+1=6 5305+1=6

当进行池化操作时,步长S就等于池化核的尺寸,如输入为30x30,池化核为7x7,则输出为
30 − 7 7 + 1 = 4.3 = 4 \frac{30-7}{7}+1=4.3=4 7307+1=4.3=4
就是向下取整,取最小的整数,即为4.3,也是 取4

### 卷积神经网络中移除池化层后的卷积块输出 当在卷积神经网络(CNN)架构中去除池化层后,卷积操作的结果不会被进一步缩小空间维度。这意味着每一层卷积之后的空间尺寸保持不变,除非通过其他方式改变这些参数。 #### 输出大小计算 假设输入图像尺寸为 \(H \times W\) ,通道数为 C 。对于一个标准的卷积层而言,在不考虑填充(padding)的情况下: - 如果采用内核大小(Kernel Size)为\(k\), 步幅(Stride)为\(s=1\) 的卷积,则输出的高度宽度可以表示为: \[ H_{out} = W_{out} = (H - k + 2p)/s + 1 \] 其中 p 表示 padding 数量[^1]。 由于这里讨论的是无池化的场景,因此每次经过这样的卷积运算后,如果步长 s 设置为 1 并且没有额外应用任何下采样方法的话,那么理论上讲输出特征图(feature map)应该维持相同的高宽比例,只是深度会因为滤波器数量的变化而有所不同。 #### 实验展示 为了更直观地理解这一点,下面给出一段 Python 代码来创建一个简单的 PyTorch 模型实例,该模型仅包含两个连续的卷积层而不含池化层,并打印出每一步的形状变化情况。 ```python import torch.nn as nn class ConvBlockWithoutPooling(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1): super(ConvBlockWithoutPooling, self).__init__() # 定义两层卷积 self.conv1 = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding) self.conv2 = nn.Conv2d(in_channels=out_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding) def forward(self, x): print(f'Input shape: {x.shape}') x = self.conv1(x) print(f'Shape after first conv: {x.shape}') x = self.conv2(x) print(f'Shape after second conv: {x.shape}') return x # 测试用例 input_tensor = torch.randn((1, 3, 64, 64)) # 假设输入是一个单样本RGB图片,分辨率为64*64像素 model = ConvBlockWithoutPooling(in_channels=3, out_channels=16) output = model(input_tensor) ``` 这段代码定义了一个名为 `ConvBlockWithoutPooling` 的类,它接受指定数量的输入通道作为起点并执行两次卷积变换。注意这里的卷积都设置了 padding 参数使得输出尺寸尽可能接近于原始尺寸。运行此脚本可以看到每个阶段张量的具体形态是如何演变的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值