2.1.2 AlexNet
AlexNet架构在2012年ILSVRC上大获全胜,前5位测试错误率(正确的标签必须在前5位预测中)为15.4%。 相比之下,不是基于深度网络的排名第二的错误率为26.2%。 这是计算机视觉历史上一个决定性的时刻:社区开始意识到深度学习来做视觉任务的潜力的时刻。 在实现这一飞跃之后,经过不断地改进,更多的现代体系结构和训练方法使前5位错误率低至3%。
与当今的模型相比,按照当今最流行的标准,AlexNet是一个相当小的网络。 但是在我们的例子中,它是初探神经网络,并且学习如何在新图像上运行它的预训练版本的完美之选。
我们可以在图2.3中看到AlexNet的结构。 并不是说我们现在需要理解它的所有要素,但是我们可以预期一些方面。 首先,每个块由一堆乘法和加法以及输出中的许多其他函数组成,我们将在第5章中找到这些函数。我们可以将其视为过滤器-一种将一个或多个图像作为输入并生成其他图像作为输出的函数。 在训练过程中,将根据所看到的示例以及这些示例的期望输出来确定其执行方式。
![](https://img.haomeiwen.com/i13625047/64d3306bca99ec6e.png)
在图2.3中,输入图像从左侧进入并经过五叠过滤器,每个过滤器产生许多输出图像。 在每个过滤器之后,如注释所示,图像尺寸会减小。 由最后一叠过滤器产生的图像按4,096个元素的一维矢量进行布局,并分类以产生1,000个输出概率,每个输出对应一个类别。
为了在输入图像上运行AlexNet体系结构,我们可以创建AlexNet类的实例。 就是像这样做:
# In[3]:
alexnet = models.AlexNet()
在这一点上,alexnet是可以运行AlexNet架构的对象。 对于我们而言,暂时不必了解此体系结构的详细信息。 目前,AlexNet只是一个不透明的对象,可以像函数一样调用。 通过为alexnet提供一些大小正确的输入数据(我们很快就会看到这些输入数据应该是什么),我们将通过网络进行前向传递。 也就是说,输入将通过第一组神经元,其输出将被馈送到下一组神经元,一直到最终输出。 实际上,假设我们具有正确类型的输入对象,则可以使用output = alexnet(input)运行正向传递。
但是,如果这样做,我们将通过整个网络馈送数据以产生……垃圾! 这是因为网络尚未初始化:它的权重(输入相乘和相乘的数字)没有经过任何训练,网络本身是一片空白(或者说是随机的)。 我们需要从零开始训练它,或者从之前的训练中加载权重,那么现在我们将这么做。
为此,让我们回到模型模块。 我们了解到大写名称对应于实现计算机视觉流行架构的类。 另一方面,小写名称是使用预定数量的层和单位实例化模型,并可以选择将预训练的权重下载并加载到其中的函数。 请注意,使用这些功能之一并没有必要:它们只是使您可以方便地使用与预训练网络的构建方式匹配的多个层和单元实例化模型。
网友评论