卷积神经网络中的卷积层详解
立即解锁
发布时间: 2025-09-02 00:50:42 阅读量: 9 订阅数: 34 AIGC 

### 卷积神经网络中的卷积层详解
#### 1. 卷积神经网络的起源与优势
在图像识别任务中,深度神经网络搭配全连接层并非适用于所有情况。虽然它在处理小图像(如MNIST数据集图像)时表现出色,但对于大图像,由于所需参数数量巨大,并不适用。例如,一张100×100的图像有10000个像素,若第一层仅包含1000个神经元,就会产生1000万个连接,这还只是第一层。而卷积神经网络(CNN)通过使用部分连接层和共享权重解决了这一问题。
CNN的起源可追溯到对视觉皮层的研究。研究发现,一些神经元只对水平线条图像有反应,另一些则对其他方向的线条有反应,且部分神经元的感受野更大,能对更复杂的图案做出反应。这些观察促使了1980年neocognitron的提出,并逐渐演变成如今的卷积神经网络。1998年,Yann LeCun等人发表文章介绍了著名的LeNet - 5架构,该架构被银行广泛用于识别手写支票号码。LeNet - 5除了包含全连接层和Sigmoid激活函数外,还引入了卷积层和池化层。
#### 2. 卷积层的结构与特点
卷积层是CNN最重要的构建模块。在第一层卷积层中,神经元并非与输入图像的每个像素相连,而是仅与它们感受野内的像素相连。第二层卷积层的神经元则与第一层中一个小矩形内的神经元相连。这种架构使网络能够在第一个隐藏层聚焦于低层次特征,然后在后续隐藏层将其组合成更高层次的特征,这种层次结构在真实图像中很常见,也是CNN在图像识别中取得良好效果的原因之一。
与之前研究的多层神经网络不同,CNN的每一层以二维形式表示,更便于将神经元与相关输入对应起来。一个位于给定层第i行第j列的神经元,与前一层第i到i + fh - 1行、第j到j + fw - 1列的神经元输出相连,其中fh和fw分别是感受野的高度和宽度。为使当前层与前一层具有相同的高度和宽度,可在输入周围添加零,即零填充(zero padding),这里为避免混淆,称为添加零边距。
此外,还可通过间隔感受野将大输入层连接到较小的层,这能显著降低模型计算复杂度。两个连续感受野之间的间隔称为步长(stride)。例如,一个5×7(含边距)的输入层可通过3×3的感受野和步长为2连接到一个3×4的层。位于上层第i行第j列的神经元与前一层第i×sh到i×sh + fh - 1行、第j×sw到j×sw + fw - 1列的神经元输出相连,其中sh和sw分别是垂直和水平步长。
#### 3. 滤波器
神经元的权重可以表示为与感受野大小相同的小图像,这些权重集合被称为滤波器(或卷积核)。例如,一个7×7的矩阵,除中间列全为1外其余全为0,使用该权重的神经元将忽略感受野内除中间垂直线外的所有内容;另一个中间有水平白线的滤波器,使用该权重的神经元将忽略除中间水平线外的所有内容。
如果一层中的所有神经元使用相同的垂直滤波器(以及相同的常数项),并将图中所示的图像作为网络输入,该层将输出左上角的图像,垂直白线被突出显示,其余部分变模糊。同理,当所有神经元使用水平滤波器时,将输出右上角的图像,水平白线被增强,其余部分模糊。使用相同滤波器的神经元层会产生一个特征图(feature map),突出显示图像中最接近滤波器的区域。在训练过程中,卷积层会自动学习最有用的滤波器,上层则学习将它们组合成更复杂的图案。
#### 4. 堆叠多个特征图
为简化起见,之前将卷积层的输出表示为二维层,但实际上它由多个滤波器组成(数量可自行决定),每个滤波器产生一个特征图,因此更准确地应将其表示为三维。在每个特征图中,每个像素对应一个神经元,且给定特征图中的所有神经元共享相同的参数(权重和常数项),但不同特征图中的神经元使用不同的参数。神经元的感受野如前所述,但会扩展到前一层的所有特征图。
输入图像通常由多个子层组成,每个颜色通道对应一个子层。经典的有红、绿、蓝三个通道(RGB),灰度图像只有一个通道,卫星图像等可能有更多通道。
一个位于卷积层l的特征图k第i行第j列的神经元,与前一层l - 1中第i×sh到i×sh + fh - 1行、第j×sw到j×sw + fh - 1列的所有特征图中的神经元输出相连。位于相同行i和列j,但不同特征图中的所有神经元,都与前一层中的相同神经元输出相连。计算卷积层中给定神经元输出的公式如下:
\[z_{i,j,k} = b_k + \sum_{u = 0}^{f_h - 1} \sum_{v = 0}^{f_w - 1} \sum_{k' = 0}^{f_n' - 1} x_{i',j',k'} w_{u,v,k',k}\]
其中:
- \(z_{i,j,k}\):卷积层l的特征图k中第i行第j列神经元的输出。
- \(sh\)和\(sw\):垂直和水平步长。
- \(fh\)和\(fw\):感受野的高度和宽度。
- \(fn'\):前一层(层l - 1)中的特征图数量。
- \(x_{i',j',k'}\):前一层l - 1中第i'行第j'列、特征图k'(或如果前一层是输入层,则为通道k')的神经元输出。
- \(b_k\):特征图k(在层l中)的常数项,可视为特征图k整体亮度的调整。
- \(w_{u,v,k',k}\):层l的特征图k中任何神经元与其在特征图k'中位于第u行第v列(相对于神经元感受野)的输入之间的连接权重。
#### 5. 使用TensorFlow实现卷积层
在TensorFlow中,每个输入图像通常用一个形状为[高度, 宽度, 通道数]的三维张量表示,小批量数据用形状为[小批量大小, 高度, 宽度, 通道数]的四维张量表示。卷积层的权重用形状为[fh, fw, fn', fn]的四维张量表示,常数项用形状为[fn]的一维张量表示。
以下是一个简单示例,展示如何使用Scikit - Learn的load_sample_image()函数加载两张彩色图像,创建两个滤波器,将其应用于这两张图像,并显示其中一个特征图:
```python
from sklearn.datasets import load_sample_image
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
# 加载示例图像
china = load_sample_image("china.jpg") / 255
flower = load_sample_image("flower.jpg") / 255
images = np.array([china, flower])
batch_size, height, width, channels = images.shape
# 创建两个滤波器
filters = np.zeros(shape=(7, 7, channels, 2), dty
```
0
0
复制全文
相关推荐









