当前位置:   article > 正文

深度学习 精选笔记(12)卷积神经网络-理论基础2

深度学习 精选笔记(12)卷积神经网络-理论基础2

学习参考:

①如有冒犯、请联系侵删。
②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。
③非常推荐上面(学习参考)的前两个教程,在网上是开源免费的,写的很棒,不管是开始学还是复习巩固都很不错的。

深度学习回顾,专栏内容来源多个书籍笔记、在线笔记、以及自己的感想、想法,佛系更新。争取内容全面而不失重点。完结时间到了也会一直更新下去,已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。所有文章涉及的教程都会写在开头、一起学习一起进步。

1.填充 (padding)和 步幅(步长)(stride)

填充(Padding):

  • 填充是指在输入特征图周围添加额外的像素值(通常是0),以扩大特征图的尺寸。填充可以用来控制卷积层输出特征图的空间尺寸,避免信息丢失,同时有助于处理边界信息。
  • 填充可以是"valid"填充(即无填充)或"same"填充(使得输出特征图尺寸与输入特征图尺寸相同)。"valid"填充表示不使用填充,输出尺寸会减小;"same"填充表示使用足够的填充使得输出尺寸与输入尺寸相同。

步幅(Stride):

  • 步幅是指卷积核在对输入特征图进行卷积操作时的移动步长。步幅控制了卷积核每次滑动的距离,影响了输出特征图的尺寸。
  • 大步幅会导致输出特征图尺寸减小,而小步幅会导致输出特征图尺寸增大。
  • 通常情况下,步幅为1是比较常见的选择,可以保留更多空间信息。但在某些情况下,可以使用大步幅来减小特征图尺寸,提高计算效率。

填充和步幅的组合方式会影响卷积层的输出尺寸。通过调整填充和步幅的数值,可以控制卷积神经网络在不同层面提取特征的方式,从而更好地适应特定的任务和数据。填充和步幅的选择也与输入图像尺寸、卷积核大小等因素有关,需要根据具体情况进行调整。

假设以下情景: 有时,在应用了连续的卷积之后,最终得到的输出远小于输入大小。这是由于卷积核的宽度和高度通常大于 1 所导致的。比如,一个 240×240 像素的图像,经过 10 层 5×5 的卷积后,将减少到 200×200 像素。如此一来,原始图像的边界丢失了许多有用信息。而填充是解决此问题最有效的方法;

有时,可能希望大幅降低图像的宽度和高度。例如,如果发现原始的输入分辨率十分冗余。步幅则可以在这类情况下提供帮助。

1.1 填充

在应用多层卷积时,常常丢失边缘像素。 由于通常使用小卷积核,因此对于任何单个卷积,可能只会丢失几个像素。 但随着应用许多连续卷积层,累积丢失的像素数就多了。 解决这个问题的简单方法即为填充(padding):在输入图像的边界填充元素(通常填充元素是 0 )。

将 3×3输入填充到 5×5 ,那么它的输出就增加为 4×4 。阴影部分是第一个输出元素以及用于输出计算的输入和核张量元素: 0×0+0×1+0×2+0×3=0 。
在这里插入图片描述

卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。 选择奇数的好处是,保持空间维度的同时,可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。
此外,使用奇数的核大小和填充大小也提供了书写上的便利。对于任何二维张量X,当满足:

  • 卷积核的大小是奇数;
  • 所有边的填充行数和列数相同;
  • 输出与输入具有相同高度和宽度

则可以得出:输出Y[i, j]是通过以输入X[i, j]为中心,与卷积核进行互相关计算得到的。

例子:创建一个高度和宽度为3的二维卷积层,并(在所有侧边填充1个像素)。给定高度和宽度为8的输入,则输出的高度和宽度也是8。

import tensorflow as tf


# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):
    # 这里的(1,1)表示批量大小和通道数都是1
    X = tf.reshape(X, (1, ) + X.shape + (1, ))
    Y = conv2d(X)
    # 省略前两个维度:批量大小和通道
    return tf.reshape(Y, Y.shape[1:3])

# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
conv2d = tf.keras.layers.Conv2D(1, kernel_size=3, padding='same')
X = tf.random.uniform(shape=(8, 8))
comp_conv2d(conv2d, X).shape
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
TensorShape([8, 8])
  • 1

例子:当卷积核的高度和宽度不同时,可以填充不同的高度和宽度,使输出和输入具有相同的高度和宽度。在如下示例中,使用高度为5,宽度为3的卷积核,高度和宽度两边的填充自动分别为2和1。

conv2d = tf.keras.layers.Conv2D(1, kernel_size=(5, 3), padding='same')

comp_conv2d(conv2d, X).shape
  • 1
  • 2
  • 3

填充可以增加输出的高度和宽度。这常用来使输出与输入具有相同的高和宽。

1.2步幅

卷积窗口从输入张量的左上角开始,向下、向右滑动。 在上面的例子中,默认每次滑动一个元素。 但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。将每次滑动元素的数量称为步幅(stride)

下图是垂直步幅为 3 ,水平步幅为 2 的二维互相关运算。 着色部分是输出元素以及用于输出计算的输入和内核张量元素: 0×0+0×1+1×2+2×3=8、0×0+6×1+0×2+0×3=6 。

解释:为了计算输出中第一列的第二个元素和第一行的第二个元素,卷积窗口分别向下滑动三行和向右滑动两列。但是,当卷积窗口继续向右滑动两列时,没有输出,因为输入元素无法填充窗口(除非添加另一列填充)。
在这里插入图片描述

通常,当垂直步幅为

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/261177
推荐阅读
相关标签