经典现代卷积网络1-AlexNet
前言
接下来一次介绍现代卷积神经网络
的架构:
-
AlexNet。它是第一个在大规模视觉竞赛中击败传统计算机视觉模型的大型神经网络;
-
使用重复块的网络(VGG)。它利用许多重复的神经网络块;
-
网络中的网络(NiN)。它重复使用由卷积层和卷积层(用来代替全连接层)来构建深层网络;
-
含并行连结的网络(GoogLeNet)。它使用并行连结的网络,通过不同窗口大小的卷积层和最大汇聚层来并行抽取信息;
-
残差网络(ResNet)。它通过残差块构建跨层的数据通道,是计算机视觉中最流行的体系架构;
-
稠密连接网络(DenseNet)。它的计算成本很高,但给我们带来了更好的效果
LeNet
在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机. LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意.
一节看到,神经网络可以直接基于图像的原始像素进行分类。这种称为端到端(end-to-end)的方法节省了很多中间步骤。 这类图像分类研究的主要流程是:
- 获取图像数据集;
- 使用已有的特征提取函数生成图像的特征;
- 使用机器学习模型对图像的特征分类。
与训练端到端(从像素到分类结果)系统不同,经典机器学习的流水线看起来更像下面这样:
- 获取一个有趣的数据集。在早期,收集这些数据集需要昂贵的传感器(在当时最先进的图像也就100万像素)。
- 根据光学、几何学、其他知识以及偶然的发现,手工对特征数据集进行预处理。
- 通过标准的特征提取算法,如SIFT或其他手动调整的流水线来输入数据。
- 将提取的特征送入最喜欢的分类器中(例如线性模型或其它核方法),以训练分类器。
2012年,AlexNet横空出世。它首次证明了学习到的特征可以超越手工设计的特征。它一举打破了计算机视觉研究的现状,通过CNN学习特征 。 AlexNet使用了8层卷积神经网络,并以很大的优势赢得了2012年ImageNet图像识别挑战赛。
简化的两个网络的对比:
- stride=4 是受限于当时的算力所致
复杂度对比:
AlexNet与LeNet区别
AlexNet与LeNet的设计理念非常相似,但也有显著的区别。
- 第一,与相对较小的LeNet相比,AlexNet包含8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。 在AlexNet的第一层,卷积窗口的形状是。 由于ImageNet中大多数图像的宽和高比MNIST图像的多10倍以上,因此,需要一个更大的卷积窗口来捕获目标。 第二层中的卷积窗口形状被缩减为,然后是。 此外,在第一层、第二层和第五层卷积层之后,加入窗口形状为、步幅为2的最大汇聚层。 而且,AlexNet的卷积通道数目是LeNet的10倍。 在最后一个卷积层后有两个全连接层,分别有4096个输出。 这两个巨大的全连接层拥有将近1GB的模型参数。 由于早期GPU显存有限,原版的AlexNet采用了双数据流设计,使得每个GPU只负责存储和计算模型的一半参数。 幸运的是,现在GPU显存相对充裕,所以我们现在很少需要跨GPU分解模型(因此,我们的AlexNet模型在这方面与原始论文稍有不同)
- 第二,AlexNet将sigmoid激活函数改成了更加简单的ReLU激活函数。
- 第三,AlexNet通过丢弃法来控制全连接层的模型复杂度。而LeNet没有使用丢弃法,而只是使用了权重衰减。(在隐藏全连接层厚加入了丢弃层)
- 第四,AlexNet引入了大量的图像增广,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。
AlexNet跟LeNet结构类似,但使用了更多的卷积层和更大的参数空间来拟合大规模数据集ImageNet。它是浅层神经网络和深度神经网络的分界线。
实现AlexNet
稍微简化的AlexNet:
|
|
1.加载数据:
ImageNet数据集中图片的大小为369*387,
我们这里使用Fashion-MNIST
数据集来演示AlexNet。读取数据的时候我们额外做了一步将图像高和宽扩大到AlexNet使用的图像高和宽224。这个可以通过torchvision.transforms.Resize
实例来实现。也就是说,我们在ToTensor实例前使用Resize实例,然后使用Compose实例来将这两个变换串联以方便调
|
|
2.构建模型:
|
|
如果用imagenet的彩色图片就是:
|
|
3.损失函数和优化方法:
|
|
完整代码:
|
|
我不跑了,忽然发现我的小mac已经烫手了,才跑了一个epoch,用时15分钟….唉没有配置好点的电脑学习都学不了……
一些可视化地址: https://poloclub.github.io/cnn-explainer/ https://ezyang.github.io/convolution-visualizer/ https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html https://visualgo.net/zh