卷积神经网络CNN
- 深度学习
- 3天前
- 39热度
- 0评论
图像卷积
图像卷积是有一个卷积核,这个卷积核对输入做相关运算。卷积核从输入的张量左上角开始、从左到右、从上到下进行滑动,每到一个位置时,在该窗口的部分张量与卷积核做点积得到一个输出。
为什么要使用卷积了,主要是要解决以下问题
- 参数爆炸问:传统全连接网络处理图像时参数规模过大(如1000×1000像素图像需30亿参数),而CNN通过局部连接和权值共享大幅减少参数数量23。
- 平移不变性缺:卷积核的滑动扫描机制使CNN能识别不同位置的相同特征。
- 局部相关性建:通过卷积操作捕捉相邻像素间的空间关联性。
如果是多个输入通道,比如图片RGB 3个通道,那么核函数对应有3个核函数,下面是2个通道的示例。
池化pooling
在处理图像时,每个像素的变化会导致参数变化也比较大,随着神经网络层数的上升,每个神经元对其敏感的感受就越大,这样对训练不一定是件好事情。为了减低卷积层对位置的敏感性,可以通过再加一层池化层来解决,池化一般有最大值和平均值两种方法。
- maximum pooling: 取池化层窗口的最大值
- average pooling: 取池化层窗口的平均值。
池化层与卷积的运算类似,只不过运算不一样。池化窗口从输入张量的左上角开始、从左往右、从上往下的在输入张量内滑动。在池化窗口达到的位置,计算该窗口的子张量最大值或者平均值。
LeNet网络
LeNet是最早的卷积神经网络,在1989年广泛运用在自动取款机中。
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
#第一个参数1表示输入通道,6表示输出通道。这里的通道指的
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10))
参考: <动手学深度学习 V2>