RGB彩色图像的卷积过程(gif动图演示)

转载自:https://blog.youkuaiyun.com/oMoDao1/article/details/83545144

在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数: 
  a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
  b. 步长stride:决定滑动多少步可以到边缘。

  c. 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。 

  这里写图片描述 

    cs231n课程中有一张卷积动图,貌似是用d3js 和一个util 画的,我根据cs231n的卷积动图依次截取了18张图,然后用一gif 制图工具制作了一gif 动态卷积图。如下gif 图所示

    可以看到:

  • 两个神经元,即depth=2,意味着有两个滤波器。
  • 数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
  • zero-padding=1。

    然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

    如果初看上图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情:

  • 左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
  • 中间部分是两个不同的滤波器Filter w0、Filter w1
  • 最右边则是两个不同的输出

    随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。

    值得一提的是:

  1. 左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
  • 打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。

与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

  • 再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。

    我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说计算过程是“相乘后相加”,但到底具体是个怎么相乘后相加的计算过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。

    首先,我们来分解下上述动图,如下图

    接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:

1* 0 + 1*0 + -1*0 

+

-1*0 + 0*0 + 1*1

+

-1*0 + -1*0 + 0*1

 

+

-1*0 + 0*0 + -1*0

+

0*0 + 0*1 + -1*1

+

1*0 + -1*0 + 0*2

 

+

0*0 + 1*0 + 0*0

+

1*0 + 0*2 + 1*0

+

0*0 + -1*0 + 1*0

 

+

 

1

=

1

    然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果

    最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。

### 关于卷积神经网络的工作过程演示 卷积神经网络(CNN)是一种专门设计用于处理具有类似网格结构的数据的前馈神经网络,比如时间序列数据或图像数据。CNN通过一系列特定类型的层来实现其功能,这些层包括但不限于卷积层、池化层以及全连接层。 #### 卷积操作 在卷积层中,输入数据被多个小型矩阵(称为卷积核或滤波器)扫描并执行逐元素乘法加总的操作,从而生成新的表示形式——特征映射(feature map)[^1]。此过程中使用的卷积核通常会应用滑窗技术,在整个输入空间上移以捕获不同区域的信息[^4]。 #### 激活函数 为了引入非线性特性到模型之中,每一层之后都会接有一个激活函数,最常用的是ReLU(Rectified Linear Unit),它能够有效地缓解梯度消失问题,并加速训练收敛速度。 #### 池化(Pooling) 紧随卷积层之后往往是池化层,该层的作用是对特征映射做降采样(down-sampling), 减少参数数量的同时保留最重要的信息。最大池化(Max Pooling)是最常见的做法之一,选取窗口内最大的值作为代表输出[^2]。 #### 画展示 虽然无法在此处提供实际的GIF文件,但是可以通过文字描述一个典型的CNN工作流程: 假设有一张彩色RGB片作为输入进入第一个卷积层;接着经过若干次卷积运算加上激活后形成多通道的特征;随后利用池化机制缩小尺寸但仍保持核心语义不变;重复上述步骤直到最后一组卷积-激活-池化的组合完成为止;最后展平(flatten)所有得到的小型高维向量送入标准MLP(Multi-Layer Perceptron)部分进行分类预测任务[^3]。 ```python import tensorflow as tf from tensorflow.keras import layers, models model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) # Add more convolution and pooling layers... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值