厦门建站方案,wordpress百度提交,宁波网站制作公司官网,电子商务网站建设的整体规划学习参考#xff1a;
动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning
①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面#xff08;学习参考#x…学习参考
动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning
①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)以达到集多方教程的精华于一文的目的。 ③非常推荐上面学习参考的前两个教程在网上是开源免费的写的很棒不管是开始学还是复习巩固都很不错的。
深度学习回顾专栏内容来源多个书籍笔记、在线笔记、以及自己的感想、想法佛系更新。争取内容全面而不失重点。完结时间到了也会一直更新下去已写完的笔记文章会不定时一直修订修改(删、改、增)以达到集多方教程的精华于一文的目的。所有文章涉及的教程都会写在开头、一起学习一起进步。
学习推荐
https://blog.csdn.net/hjkdh/article/details/124565443卷积神经网络的深入理解-基础篇卷积激活池化误差反传
1.特征提取的重要性
在LeNet提出后卷积神经网络在计算机视觉和机器学习领域中很有名气。但卷积神经网络并没有主导这些领域。这是因为虽然LeNet在小数据集上取得了很好的效果但是在更大、更真实的数据集上训练卷积神经网络的性能和可行性还有待研究。
在计算机视觉中直接将神经网络与其他机器学习方法进行比较也许不公平。这是因为卷积神经网络的输入是由原始像素值或是经过简单预处理例如居中、缩放的像素值组成的。但在使用传统机器学习方法时从业者永远不会将原始像素作为输入。在传统机器学习方法中计算机视觉流水线是由经过人的手工精心设计的特征流水线组成的。对于这些传统方法大部分的进展都来自于对特征有了更聪明的想法并且学习到的算法往往归于事后的解释。
因此与训练端到端从像素到分类结果系统不同经典机器学习的流水线看起来更像下面这样
获取一个有趣的数据集。在早期收集这些数据集需要昂贵的传感器在当时最先进的图像也就100万像素。根据光学、几何学、其他知识以及偶然的发现手工对特征数据集进行预处理。通过标准的特征提取算法如SIFT尺度不变特征变换和SURF加速鲁棒特征或其他手动调整的流水线来输入数据。将提取的特征送入最喜欢的分类器中例如线性模型或其它核方法以训练分类器。
然而推动领域进步的是数据特征而不是学习算法。计算机视觉研究人员相信从对最终模型精度的影响来说更大或更干净的数据集、或是稍微改进的特征提取比任何学习算法带来的进步要大得多。
2.学习表征
1另一种预测这个领域发展的方法————观察图像特征的提取方法。在2012年前图像特征都是机械地计算出来的。事实上设计一套新的特征函数、改进结果并撰写论文是盛极一时的潮流。SIFT 、SURF 、HOG定向梯度直方图、bags of visual words和类似的特征提取方法占据了主导地位。
2另一组研究人员包括Yann LeCun、Geoff Hinton、Yoshua Bengio、Andrew Ng、Shun ichi Amari和Juergen Schmidhuber想法则与众不同他们认为特征本身应该被学习。此外他们还认为在合理地复杂性前提下特征应该由多个共同学习的神经网络层组成每个层都有可学习的参数。在机器视觉中最底层可能检测边缘、颜色和纹理。事实上Alex Krizhevsky、Ilya Sutskever和Geoff Hinton提出了一种新的卷积神经网络变体AlexNet。在2012年ImageNet挑战赛中取得了轰动一时的成绩。
有趣的是在网络的最底层AlexNet模型学习到了一些类似于传统滤波器的特征抽取器。
AlexNet的更高层建立在这些底层表示的基础上以表示更大的特征如眼睛、鼻子、草叶等等。而更高的层可以检测整个物体如人、飞机、狗或飞盘。最终的隐藏神经元可以学习图像的综合表示从而使属于不同类别的数据易于区分。尽管一直有一群执着的研究者不断钻研试图学习视觉数据的逐级表征然而很长一段时间里这些尝试都未有突破。深度卷积神经网络的突破出现在2012年。突破可归因于两个关键因素数据和硬件GPU。
2.1 缺少的成分数据
包含许多特征的深度模型需要大量的有标签数据才能显著优于基于凸优化的传统方法如线性方法和核方法。 然而限于早期计算机有限的存储和90年代有限的研究预算大部分研究只基于小的公开数据集。
例如不少研究论文基于加州大学欧文分校UCI提供的若干个公开数据集其中许多数据集只有几百至几千张在非自然环境下以低分辨率拍摄的图像。这一状况在2010年前后兴起的大数据浪潮中得到改善。
2009年ImageNet数据集发布并发起ImageNet挑战赛要求研究人员从100万个样本中训练模型以区分1000个不同类别的对象。ImageNet数据集由斯坦福教授李飞飞小组的研究人员开发利用谷歌图像搜索Google Image Search对每一类图像进行预筛选并利用亚马逊众包Amazon Mechanical Turk来标注每张图片的相关类别。这种规模是前所未有的。这项被称为ImageNet的挑战赛推动了计算机视觉和机器学习研究的发展挑战研究人员确定哪些模型能够在更大的数据规模下表现最好。
2.2 缺少的成分硬件
深度学习对计算资源要求很高训练可能需要数百个迭代轮数每次迭代都需要通过代价高昂的许多线性代数层传递数据。这也是为什么在20世纪90年代至21世纪初优化凸目标的简单算法是研究人员的首选。然而用GPU训练神经网络改变了这一格局。图形处理器Graphics Processing UnitGPU早年用来加速图形处理使电脑游戏玩家受益。GPU可优化高吞吐量的 4×4 矩阵和向量乘法从而服务于基本的图形任务。幸运的是这些数学运算与卷积层的计算惊人地相似。由此英伟达NVIDIA和ATI已经开始为通用计算操作优化gpu甚至把它们作为通用GPUgeneral-purpose GPUsGPGPU来销售。
3.AlexNet模型
论文《ImageNet Classification with Deep ConvolutionalNeural Networks》
2012年AlexNet横空出世。它首次证明了学习到的特征可以超越手工设计的特征。它一举打破了计算机视觉研究的现状。 AlexNet使用了8层卷积神经网络并以很大的优势赢得了2012年ImageNet图像识别挑战赛。AlexNet已经被更有效的架构所超越但它是从浅层网络到深层网络的关键一步。
完整的模型结构
AlexNet和LeNet的架构非常相似这里提供的是一个稍微精简版本的AlexNet去除了当年需要两个小型GPU同时运算的设计特点。
AlexNet和LeNet对比 AlexNet和LeNet的设计理念非常相似但也存在显著差异。
AlexNet比相对较小的LeNet5要深得多。AlexNet由八层组成五个卷积层、两个全连接隐藏层和一个全连接输出层。AlexNet使用ReLU而不是sigmoid作为其激活函数。
3.1模型设计
在AlexNet的第一层卷积窗口的形状是 11×11 。 由于ImageNet中大多数图像的宽和高比MNIST图像的多10倍以上因此需要一个更大的卷积窗口来捕获目标。 第二层中的卷积窗口形状被缩减为 5×5 然后是 3×3 。 此外在第一层、第二层和第五层卷积层之后加入窗口形状为 3×3 、步幅为2的最大汇聚层。 而且AlexNet的卷积通道数目是LeNet的10倍。
在最后一个卷积层后有两个全连接层分别有4096个输出。 这两个巨大的全连接层拥有将近1GB的模型参数。 由于早期GPU显存有限原版的AlexNet采用了双数据流设计使得每个GPU只负责存储和计算模型的一半参数。 幸运的是现在GPU显存相对充裕所以现在很少需要跨GPU分解模型。 现在只需要简化即可即取一个GPU中的结构即可。
3.2激活函数
AlexNet将sigmoid激活函数改为更简单的ReLU激活函数。 一方面ReLU激活函数的计算更简单它不需要如sigmoid激活函数那般复杂的求幂运算。 另一方面当使用不同的参数初始化方法时ReLU激活函数使训练模型更加容易。 当sigmoid激活函数的输出非常接近于0或1时这些区域的梯度几乎为0因此反向传播无法继续更新一些模型参数。 相反ReLU激活函数在正区间的梯度总是1。 因此如果模型参数没有正确初始化sigmoid函数可能在正区间内得到几乎为0的梯度从而使模型无法得到有效的训练。
3.3容量空值和预处理
AlexNet通过暂退法DropOut控制全连接层的模型复杂度而LeNet只使用了权重衰减。 为了进一步扩充数据AlexNet在训练时增加了大量的图像增强数据如翻转、裁切和变色。 这使得模型更健壮更大的样本量有效地减少了过拟合。
Dropout、ReLU和预处理是提升计算机视觉任务性能的其他关键步骤。AlexNet已经被更有效的架构所超越但它是从浅层网络到深层网络的关键一步。
3.4 模型结构与定义
模型结构
import tensorflow as tf
from d2l import tensorflow as d2ldef net():return tf.keras.models.Sequential([# 这里使用一个11*11的更大窗口来捕捉对象。# 同时步幅为4以减少输出的高度和宽度。# 另外输出通道的数目远大于LeNettf.keras.layers.Conv2D(filters96, kernel_size11, strides4,activationrelu),tf.keras.layers.MaxPool2D(pool_size3, strides2),# 减小卷积窗口使用填充为2来使得输入与输出的高和宽一致且增大输出通道数tf.keras.layers.Conv2D(filters256, kernel_size5, paddingsame,activationrelu),tf.keras.layers.MaxPool2D(pool_size3, strides2),# 使用三个连续的卷积层和较小的卷积窗口。# 除了最后的卷积层输出通道的数量进一步增加。# 在前两个卷积层之后汇聚层不用于减少输入的高度和宽度tf.keras.layers.Conv2D(filters384, kernel_size3, paddingsame,activationrelu),tf.keras.layers.Conv2D(filters384, kernel_size3, paddingsame,activationrelu),tf.keras.layers.Conv2D(filters256, kernel_size3, paddingsame,activationrelu),tf.keras.layers.MaxPool2D(pool_size3, strides2),tf.keras.layers.Flatten(),# 这里全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合tf.keras.layers.Dense(4096, activationrelu),tf.keras.layers.Dropout(0.5),tf.keras.layers.Dense(4096, activationrelu),tf.keras.layers.Dropout(0.5),# 最后是输出层。由于这里使用Fashion-MNIST所以用类别数为10而非论文中的1000tf.keras.layers.Dense(10)])构造一个高度和宽度都为224的(单通道数据来观察每一层输出的形状)。 它与AlexNet架构相匹配。
X tf.random.uniform((1, 224, 224, 1))
for layer in net().layers:X layer(X)print(layer.__class__.__name__, output shape:\t, X.shape)Conv2D output shape: (1, 54, 54, 96)
MaxPooling2D output shape: (1, 26, 26, 96)
Conv2D output shape: (1, 26, 26, 256)
MaxPooling2D output shape: (1, 12, 12, 256)
Conv2D output shape: (1, 12, 12, 384)
Conv2D output shape: (1, 12, 12, 384)
Conv2D output shape: (1, 12, 12, 256)
MaxPooling2D output shape: (1, 5, 5, 256)
Flatten output shape: (1, 6400)
Dense output shape: (1, 4096)
Dropout output shape: (1, 4096)
Dense output shape: (1, 4096)
Dropout output shape: (1, 4096)
Dense output shape: (1, 10)3.5 Fashion-MNIST数据上训练AlexNet
将AlexNet直接应用于Fashion-MNIST的一个问题是Fashion-MNIST图像的分辨率 28×28 像素低于ImageNet图像。
为了解决这个问题将它们增加到 224×224 通常来讲这不是一个明智的做法但在这里这样做是为了有效使用AlexNet架构。 这里需要使用d2l.load_data_fashion_mnist函数中的resize参数执行此调整。
batch_size 128
train_iter, test_iter d2l.load_data_fashion_mnist(batch_size, resize224)这里使用更小的学习速率训练这是因为网络更深更广、图像分辨率更高训练卷积神经网络就更昂贵。
lr, num_epochs 0.01, 10
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())3.6一些注意事项
在AlexNet中较大的卷积层和全连接层需要更多的计算资源因为它们涉及更多的矩阵乘法和加法运算。在AlexNet中主要占用显存的部分是大型的卷积层和全连接层这些层通常需要大量的参数和中间计算结果。修改批量大小可以影响训练的速度和模型精度较大的批量大小通常可以减少训练时间但也可能导致显存占用较多。需要权衡以获得最佳性能。Fashion-MNIST数据集相比于传统的手写数字数据集MNIST更加复杂但相对于ImageNet这样更大更复杂的数据集Fashion-MNIST规模较小。AlexNet作为一个大型深度网络对于这样一个小数据集可能会显得过于复杂容易发生过拟合。增加迭代轮数通常能够使模型在训练集上学习更多的特征提高泛化能力。与LeNet相比增加迭代轮数的模型可能会更加精细地学习数据中的模式产生更好的性能。将Dropout和ReLU应用于LeNet-5可以帮助减轻过拟合问题并加速收敛提升模型的泛化能力。预处理方法如数据归一化、数据增强等也可以提升模型性能使其更好地学习数据中的模式。