卷积神经网络
写在前面
参考书籍
Aston Zhang, Zachary C. Lipton, Mu Li, Alexander J. Smola. Dive into Deep Learning. 2020.
简介 - Dive-into-DL-PyTorch (tangshusen.me)
卷积神经网络
source code: NJU-ymhui/DeepLearning: Deep Learning with pytorch (github.com)
use git to clone: https://github.com/NJU-ymhui/DeepLearning.git
/CNN
cross_correlation.py fill.py multi_pipe.py pool_layer.py LeNet.py
多层感知机的局限性
卷积
图像卷积
卷积神经网络主要用于探索图像数据,因此此处以图象为例
互相关运算
严格地讲,卷积层是不严谨的,因为它所表达的运算实际上是互相关运算,而不是卷积运算。在这种卷积层中,输入张量和核张量通过互相关运算得到输出张量。
理论部分详见7.2. Cross-Correlation Operation — Dive into Deep Learning 1.0.3 documentation (d2l.ai)
code
import torch |
output
tensor([[19., 25.], |
卷积层
卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出。所以卷积层中两个被训练的参数是卷积核权重和标量偏置。因此当我们初始化参数时,要对卷积核权重进行随机初始化,同时给偏置一个初值。
code
class Conv2D(nn.Module): |
边缘检测
下面介绍卷积层的一个简单应用:通过找到像素变化的位置,检测图像中不同颜色的边缘。
code
# 边缘检测 |
output
tensor([[1., 1., 0., 0., 0., 0., 1., 1.], |
学习卷积核
如果我们只需寻找黑白边缘,那么以上[1, -1]的边缘检测器足以。然而,当有了更复杂数值的卷积核,或者连续的卷积层时,我们不可能手动设计滤波器,因此考虑通过学习由X生成Y的卷积核。
现在我们尝试仅通过查看"输入-输出"对来学习由X生成Y的卷积核
code
# 构造一个二维卷积层,它有1个输出通道和形状为(1, 2)的卷积核 |
output
before training: |
填充和步幅
在应用多层卷积时,我们常常丢失边缘像素;解决这个问题的简单办法即为填充。
填充
原理部分详见7.3. Padding — Dive into Deep Learning 1.0.3 documentation (d2l.ai)
code
import torch |
output
torch.Size([8, 8]) |
步幅
7.3. Stride — Dive into Deep Learning 1.0.3 documentation (d2l.ai)
code
# 步幅 2 |
output
torch.Size([4, 4]) |
多输入多输出通道
之前我们一直在讨论单通道时的情况,但实际情况往往是更加复杂的。例如彩色图像往往采用标准RGB通道来代表红、绿、蓝,这就已经有三个通道了。
多输入通道
当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。
code
import torch |
output
tensor([[ 56., 72.], |
多输出通道
目前尽管我们已经实现了多输入通道,但是输出通道还是只有一个。在当下的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。
code
import torch |
output
multi in: |
1 * 1卷积层
code
import torch |
output
1 * 1 correlation: |
汇聚层
通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率、聚集信息,这样随着我们在神经网络中层叠的上升,每个神经元对其敏感的感受野(输入)就越大。
而机器学习任务通常会跟全局图像的问题有关(例如,“图像是否包含一只猫呢?”),所以最后一层的神经元应该对整个输入的全局敏感。通过逐渐聚合信息,生成越来越粗糙的映射,最终实现学习全局表示的目标,同时将卷积图层的所有优势保留在中间层。
原理部分见7.5. Pooling — Dive into Deep Learning 1.0.3 documentation (d2l.ai)
code
import torch |
output
tensor([[4., 5.], |
LeNet
到目前,我们已经掌握了构建一个完整卷积神经网络的所需组件。之前在处理Fashion-MNIST数据集时,我们使用了softmax回归和多层感知机模型,但这样需要将28 * 28的图像展平为一个784维的向量,破坏了其空间结构。而现在,通过卷积层,我们可以保留图像中的空间结构。
LeNet是一种卷积神经网络之一,是一种监督学习。
主要有两部分组成:
- 卷积编码器:由两个卷积层组成
- 全连接层密集块:由三个全连接层组成
code
import torch |
output
Conv2d output shape: torch.Size([1, 6, 28, 28]) |

(•‿•)