为什么CNN中的卷积核大小一般是奇数

卷积核大小一般是奇数

  • 便于进行padding
    same convolution时,有些情况偶数卷积核会出现问题。假设:输入图片大小W×W;Filter大小F×F;步长strides S;padding的像素数 P;输出大小NxN。于是 N = W − F + 12 ∗ P S + 1 N=\frac{W-F+12*P}{S}+1 N=SWF+12P+1,当做一种same convolution时,若要卷积前后的尺寸不变,即要求输入和输出大小一样N=W,且步长S=1,则Padding P = ( F − 1 ) 2 P=\frac{(F-1)}{2} P=2F1,当卷积核的大小F为偶数则不是整数了。
  • 容易找到卷积锚点
    在像素这个领域里,偶数框其实是没有一个“绝对的物理中心”的。锚点也就是卷积核滑动时的一个参考点。奇数过滤器的锚点正好在中心位置,避免了位置信息发生偏移,如果卷积核是偶数时,这时候就没有办法确定了锚点了。让谁是锚点,卷积核上下左右移动之后,位置信息都会发生偏移。

padding问题

为什么加padding?做卷积时会出现两种问题:1)图像越来越小;2)图像边界信息丢失,即有些图像角落和边界的信息发挥作用较少。所以有时候我们会在图像的周围填补 0 ,1)来减缓图像变小的速度;2)保证边界信息不丢失。

卷积的三种模式:full, same, valid

其实这三种不同模式是对卷积核移动范围的不同限制,设 image的大小是7x7,filter的大小是3x3。
full mode
在这里插入图片描述
橙色部分为image, 蓝色部分为filter。full模式的意思是,从filter和image刚相交开始做卷积,白色部分为填0。filter的运动范围如图所示。
same mode
在这里插入图片描述
当filter的中心K与image的边角重合时,开始做卷积运算,可见filter的运动范围比full模式小了一圈。注意:这里的same还有一个意思,卷积之后输出的feature map尺寸保持不变(相对于输入图片)。当然,same模式不代表完全输入输出尺寸一样,也跟卷积核的步长有关系。same模式也是最常见的模式,因为这种模式可以在前向传播的过程中让特征图的大小保持不变,调参师不需要精准计算其尺寸变化(因为尺寸根本就没变化)。
valid
在这里插入图片描述
当filter全部在image里面的时候,进行卷积运算,可见filter的移动范围较same更小了。

### Conv1D 中卷积核大小的默认值 在 TensorFlow 的 Keras API 中,`tf.keras.layers.Conv1D` 是用于一维卷积操作的核心层之一。该函数定义了一个参数 `kernel_size` 来指定卷积核大小。然而,默认情况下,`kernel_size` 并未设置任何固定值[^1]。 这意味着如果用户不显式提供 `kernel_size` 参数,则会抛出错误提示缺少必要参数。因此,在实际应用中,开发者需要手动设定此参数以满足具体需求。例如: ```python import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.Conv1D(filters=64, kernel_size=3, input_shape=(None, 128)) ]) ``` 上述代码片段展示了如何通过传递整数值(如 `3`)给 `kernel_size` 参数来创建具有特定尺寸的一维卷积核。 值得注意的是,尽管 `kernel_size` 没有预设默认值,但在某些高级封装或者模型构建工具中可能会存在约定俗成的选择。比如一些教程或案例常采用较小奇数作为初始尝试选项 (e.g., 3 或者 5)[^2]。 #### 关于卷积过程的理解补充说明 对于更深层次理解而言,可以类比二维卷积 (`conv2d`) 运作机制:当输入数据经过一系列滤波器作用之后,其输出特征图中的每个位置都是由相应感受野区域内的像素点加权求和所得结果构成。同样道理适用于一维情况下的时间序列分析场景下使用的 `Conv1D` 层——只不过这里只考虑单方向上的局部模式提取而已[^2]。 ```python # 示例展示 Conv1D 使用方法及其效果 from tensorflow import keras import numpy as np data = np.random.rand(1, 10, 1).astype('float32') # 输入形状为 [batch_size, timesteps, features] layer = keras.layers.Conv1D( filters=2, kernel_size=4, strides=1, padding="same", activation='relu' ) output = layer(data) print(f'Input shape: {data.shape}') print(f'Output shape after applying Conv1D: {output.shape}') ``` 以上脚本演示了怎样利用自定义好的超参配置实例化一层简单的 Convolutional Neural Network(CNN),并观察到即使原始信号长度保持不变的情况下也能有效捕捉潜在规律特性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值