神经网络:CNN中的filter,kernel_size,strides,padding对输出形状的影响

卷积层的输出形状由filter(输出通道数)、kernel_size(卷积核大小)、strides(步幅)和padding(填充方式)这四个超参数决定。padding可取VALID或SAME,SAME时输出宽度公式为1+(n-1)//s。步幅和填充会影响输出尺寸,卷积核奇偶性也会影响SAME模式下的填充效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入数据在经过卷积层后,形状一般会发生改变,而形状的变化往往与以下四个超参数有关。

1,filter(out_channel)

该超参数控制着输入数据经过卷积层中需要与几个卷积核进行运算,而输入数据与每个卷积核进行卷积运算后会产生一个二维矩阵,因此最后会产生 filter 个矩阵,分别分布在输出的各个通道中。故该超参数决定输出的通道数。

2,kernel_size(k)

卷积核的宽高一般来说是相等的,且都等于kernel_size,对应一个n x n x 3 (忽略样本轴)的输入数据,在经过卷积层后,输出的宽高 = 1 + (n - k) // s,双斜杠表示整除,s表示步幅strides。当n,k,s中的某个宽高不相等时,则输出的宽高需分别代入n, k, s的宽高进行计算。

3,strides(s)

步幅的大小决定了视野域(卷积核的形状映射在输入数据上的窗口)每次移动的距离,输出的宽高符合公式 1 + (n - k) // s。如下图(n = 5, k = 3, s = 1)
e

4,padding

padding的设置在卷积运算之前就对元输入数据进行修改填充0,一般来说padding可取值VALIDSAME(pytorch中可分别对行列进行填充)。
①当取值为VALID时,则可用公式 1 + (n - k) // s 计算输出的宽高。
②当取值为SAME时,这时 k 的奇偶性就会影响到填充效果。
A:当 k 为奇数时,则上下左右都会填充 (k - 1) / 2 (可整除)个0行,故输出宽高可用公式 1 + (n + k - 1 - k) // s = 1 + (n - 1) // s(在Pytorch中,当 padding = SAME 时,s 必须等于1)。如下图(n = 5,k = 3,s = 1)
在这里插入图片描述

B:当k为偶数时,则上下左右都会填充(k - 1 - 1) / 2 = (k - 2)/ 2 个0行,然后下与右再填充1个0行,故输出宽高可用公式 1 + (n - k + k - 2 + 1) // s = 1 + (n - 1) // s 。如下图(n = 5,k = 2,s = 1)
在这里插入图片描述

综上所述:当取值为SAME时,输出的宽高可用公式 1 + (n - 1) // s 计算。

### strides 参数在深度学习框架中的使用 在 TensorFlow 和其他深度学习框架中,`strides` 参数通常用于卷积操作和池化操作。该参数决定了过滤器(kernel)在输入数据上移动的步幅。 #### 在 TensorFlow 中的应用 当执行二维卷积时,可以通过 `strides` 参数控制卷积核滑动的速度: ```python import tensorflow as tf input_tensor = tf.random.normal([1, 28, 28, 3]) # 输入张量形状 (batch_size, height, width, channels) conv_layer = tf.keras.layers.Conv2D( filters=64, kernel_size=(3, 3), strides=(2, 2), # 步长为2,在高度和宽度方向都以两个像素为单位移动 padding='same', activation='relu' ) output_tensor = conv_layer(input_tensor) print(output_tensor.shape) # 输出尺寸会减半,因为 stride 设置为了(2, 2)[^1] ``` 上述代码展示了如何利用 `strides` 来调整特征图的空间维度大小。较大的步长会使输出变小,而较小或等于一的步长则保持原始分辨率不变。 #### 在 PyTorch 中的应用 同样地,在 PyTorch 中也可以定义类似的卷积层并指定其步长: ```python import torch.nn as nn class ConvNet(nn.Module): def __init__(self): super(ConvNet, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=2, padding=1) model = ConvNet() dummy_input = torch.randn((1, 3, 28, 28)) out = model(dummy_input) print(out.size()) # 同样由于设置了stride=2,空间维数减少了一半 ``` 通过合理配置 `strides` 的值,可以在设计神经网络架构时有效地管理模型的感受野以及计算资源消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值