在提出LeNet后卷积神经网络在计算机视觉和机器学习领域中报有名气,但是卷积神经网络并没有主导这些领域,因为LeNet在小数据集上取得了很好的效果,在更大,更真实的数据集上训练卷积神经网络的性能 和可行性有待研究,20世纪90年代初到2012年间的大部分时间里,神经网络往往被其他机器学习方法超越,支持向量机。
在计算机视觉中,直接将神经网络与其他机器学习方法进行表也不公平,卷积神经网络的输入事原始像素值经过简单预处理的像素值组成,但是在使用传统机器学习方法时,在传统机器学习方法中,计算机视觉流水线时经过手工精心设计的特征流水线组成的,这些传统方法,大部分的进展都来自对特征有了更聪明的想法,并且学习到的算法往往归于事后的解释。
因此,与训练端到端系统不同,经典机器学习的流水线看起来更像下面这样。
(1)获取一个有趣的数据集,收集这些数据集需要传感器,
(2)根据光学,几何学,其他知识以及偶然的发现,手动对待特征数据集进行预处理。
(3) 通过标准的特征提取算法,如SIFT或者其他手动调整的流水线来输入数据。
(4)将提取的特征送入最喜欢的分类器中,以训练分类器。
当人们和机器学习研究人员交谈时,会发现机器学习研究人员相信机器学习即重要又美丽:
7.1.1 学习表征
一种预测这个领域发展的方法时观察图像特征的提取方法,图像特征都是机械的计算出来的,设计一套新的特征函数。改进结果并撰写论文。SIFT,SURF,HOG 定向梯度直方图,都占据了主导地位。
在合理的复杂性前提下,特征应该由多个共同学习的神经网络层组成,每个层都有课学习的参数,机器视觉中,底层可能检查边缘,颜色和纹理,实际上,
7.1.2 AlexNet
2012年AlexNet横空出世,证明了学习到的特征可以超越手动设计的特征,AlexNet使用8层卷积神经网络,以很大的优势赢得了2012年ImageNet图像识别挑战赛。
AlexNet和LeNet非常类似。
LeNet
全连接层 10 ->全连接层 84 ->全连接层 120->
2x2欧拿冠军汇聚层
5x5卷积层 16
2x2 平均汇聚层
5x5卷积层
图片28x28
AlexNet
全连接层 1000
全连接层 4096
全连接层 4096
3x3最大汇聚层
3x3卷积层
3x3卷积层
3x3最大汇聚层
5x5卷积层
3x3最大汇聚层
11x11 卷积层
图片 3x244x244
AlexNet 和LeNet5要深得多,AlexNet由8层组成,5个卷积层,2个全选接隐藏层和1个全连接层输出。
2 AlexNet使用ReLU而不是sigmoid 作为其激活函数
1 模型设计
AlexNet第一层,卷积窗口的形状是11x11,由于imageNet中大多数图像的高和宽比MNIST图像的大10倍以上,因此,需要一个更大的卷积窗口来捕获目标,第二层中的卷积窗口形状缩减为5x5,然后是3x3,此外,在第一层,第二层和第五层卷积层之后,加入窗口形状为3x3,步骤为2的最大汇聚层,而且AlexNet是卷积通道数是LeNet的10倍。
在最后一个卷积层后由两个全连接层,分别有4096个输出,这两个巨大的全连接层有近1GB的模型参数,早期的GPU显存有限,原始的AlexNet才用了双数据流设计,使得每个GPU只负责存储和计算模型的一半参数,幸运的是,现在GPU现存相对充裕,所以很少需要跨GPU分解模型
2 激活函数
AlexNet将sigmoid激活函数改为简单的ReLU激活函数,一方面,ReLU激活函数的计算更简单,不需要加sigmoig激活函数复杂的求幂运算,另一方面,使用补同的参数初始化方法时,ReLU激活函数使训练模型更加容易。当sigmoid激活函数的输出非常接近于0或者1时,这些区域的梯度几乎为0,因此反向传播无法继续更新一些模型参数。而ReLU激活函数在正区间的梯度总为1,因此,如果模型参数没有正确初始化,sigmoid函数可以能在正区间得到几乎为0的梯度,从而使模型无法的得到有效的训练。
3 容量控制和预处理
AlexNet通过暂退法 控制全连接层的模型复杂度,而LeNet只使用了权重衰减,为了进一步扩增数据,AlexNet在训练时增加了大量的图像增强数据,翻转,载切和变色,这使得模型更健壮,更大的样本量有效减少了过拟合。
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential (
#这里使用一个11x11的更大窗口来捕获对象
#同时,步幅为4,以减少输出的高度和宽度
#另外,输出通道数远大于LeNet
nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2)
#减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,并且增大输出通道数
nn.Conv2d(96, 256, kernel_size=5,padding=2), nn.ReLU(),
nn.MaxPool2d(kernel_szie=3, stride=2)
#使用3个链接的卷积层和较小的卷积窗口
#除了最后的卷积层,输出通道数进一步增加
#在前两个卷积层之后,汇聚层不用于减少输入的高度和宽度
nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_szie=3, stride=2),
nn.Flatten(),
#这里,全连接层输出的数量是LeNet的好几倍,使用暂退层来缓解过拟合
nn.Linear(6400, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
#最后是输出层,因为这里使用Fashion - MNIST,所以类别数为10,
nn.Linear(4096, 10)
我们构造高度和宽度都为224的单通道数据,来观察每一层输出的形状,图7-2中AlexNet架构相匹配。
x = torch.randn(1,1,,224,224)
for layer in net:
x=layer(x)
)