关于卷积填充和步长等计算

4.1卷积神经网络

 

1.4Padding

  • 一张6∗6大小的图片,使用3∗3的卷积核设定步长为1,经过卷积操作后得到一个4∗4的图像。

    特征图大小公式

  • 设定原始图像大小为n∗n,卷积核大小为f∗f,则经过卷积操作后特征图大小为(n−f+1)∗(n−f+1)

    不使用Padding的缺点

  • 经过卷积操作后图像会缩小.
  • 如果你注意角落边的像素,则此像素点只会被卷积核触碰一次。即只会在第一次卷积操作时被卷积核扫描.这意味着会丢失图像边缘的很多信息.
  • 但是对于原始图像中心的像素点,在每次卷积操作时都会被扫描。卷积核的感受野会扫描此位置多次.

    使用Padding进行维度的填充

  • 为了使每次卷积操作后大小不会丢失,使用0填充在原始图像的外围。
  • 假设p作为填充在原始图像外围的Padding大小,则经过卷积操作后的特征图大小为(n+2p−f+1)∗(n+2p−f+1)

    Padding填充大小公式

  • 如果需要使经过卷积后的特征图大小保持不变,则填充大小需要满足公式

    n+2p−f+1=n

    p=(f−1)/2

  • 所以只要f即卷积核的边长是奇数,则能保证输出的特征图大小与原图像大小相等。

    通常使用奇数维度的过滤器大小

  • 通常使用奇数维度的过滤器大小,这样可以使SAME Padding后的图像有自然的填充而不是出现小数维度。
  • 奇数维度的卷积核具有中心点,便于指出过滤器的位置。


1.5卷积步长

示例

### 卷积神经网络步长填充计算公式 对于卷积操作而言,输出特征图尺寸取决于输入图像大小、卷积核大小以及两个重要参数——步长(stride)填充(padding)。具体来说: 当不考虑任何填充时,仅基于输入高度\(n_h\)、宽度\(n_w\)与卷积核的高度\(k_h\)、宽度\(k_w\), 输出维度可表示为: \[ (n_h - k_h + 1) \times (n_w - k_w + 1)[^3] \] 引入填充后,为了保持边界像素的信息,在原始图片周围增加额外零值区域。设上下左右各加p个单位,则新的有效输入变为 \(n_h' = n_h + 2p, n_w'=n_w+2p\) 。此时输出尺寸调整为: \[ ((n'_h - k_h + 1)) \times ((n'_w - k_w + 1))\] 进一步地,加入步长s的影响因素之后,最终输出尺寸表达式更新如下: \[ O_h=\left\lfloor{\frac{n_h'+k_h-1}{s}}\right\rfloor,\quad O_w=\left\lfloor{\frac{n_w'+k_w-1}{s}}\right\rfloor [^2]\] 其中,\(O_h,O_w\)分别代表输出的高度宽度;而向下取整函数\(\left\lfloor.\right\rfloor\)用于处理非整数情况。 上述公式展示了如何根据不同的配置选项精确控制卷积层的行为模式及其产生的结果尺寸变化规律[^2]^. ```python import math def calculate_output_size(input_height, input_width, kernel_height, kernel_width, padding=0, stride=1): """ Calculate the output size of a convolution operation. Parameters: input_height : int Height of the input image or feature map. input_width : int Width of the input image or feature map. kernel_height : int Height of the convolution kernel. kernel_width : int Width of the convolution kernel. padding : int, optional Padding added to both sides of each dimension. Default is 0. stride : int, optional Stride used during convolution. Default is 1. Returns: tuple: A pair containing height and width of the resulting feature map after applying convolutions with specified parameters. """ effective_input_height = input_height + 2 * padding effective_input_width = input_width + 2 * padding out_height = math.floor((effective_input_height - kernel_height + 1)/stride) out_width = math.floor((effective_input_width - kernel_width + 1)/stride) return (out_height, out_width) # Example usage print(calculate_output_size(7, 7, 3, 3)) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值