AlexNet 结构学习

      在2012年的时候,Geoffrey和他学生Alex为了回应质疑者,在ImageNet的竞赛中出手了,刷新了imageclassification的记录,一举奠定了deep learning 在计算机视觉中的地位。后边的故事大家都知道了,deeplearning一统天下,所向披靡。
在这次竞赛中Alex所用的结构被称为作为AlexNet。本部分首先介AlexNet的基本的architecture,在后边的学习中将分析其算法的基本原理以及参数细节。


针对2012年的这组数据集caffe也定义了自己的结构,被称为caffeNet,文档中说在迭代30多w次的的情况下精度大概提高了0.2个百分点。下面是两个Net的结构图,它们的区别在于norm1,pool1,以及norm2,pool2互换了顺序。




下面来看一下AlexNet的结构。在Alex的论文中,其基本结构为




1. 基本结构

a. 共有8层,其中前5层convolutional,后边3层full-connected,最后的一个full-connected层的output是具有1000个输出的softmax,最后的优化目标是最大化平均的multinomiallogistic regression

b. 在第一层conv1和conv2之后直接跟的是Response-nomalizationlayer,也就是norm1,norm2层。

c. 在每一个conv层以及full-connected层后紧跟的操作是ReLU操作。

d. Max pooling操作是紧跟在第一个norm1,norm2,以及第5个conv层,也就是conv5

e.Dropout操作是在最后两个full-connected层。

2. 操作流程

a.在第一个conv层(conv1)中,AlexNet采用了96个11*11*3的kernel在stride为4的情况下对于224*224*3的图像进行了滤波。直白点就是采用了11*11的卷积模板在三个通道上,间隔为4个像素的采样频率上对于图像进行了卷积操作。4个像素是receptivefield中心在kernel map上的距离,这是个经验数据。

最初的输入神经元的个数为224*224*3 = 150528个。对于每一个map来说,间隔为4,因此224/4 =56,然后减去边缘的一个为55个,也就是本层的map大小为55*55,然后神经元数目为55*55*96 =290400(原文中是253440,这个不太理解,有知道的请告知)

得到基本的conv数据后,则进行一次ReLU(relu1)以及Norm(norm1)的变换后,然后进行pooling(pool1),作为输出传递到下一层。

本层map数目为96.

b.第二个conv层(conv2)是第一个conv层(conv1)经过norm(norm1)以及pool(pool1)后,然后再apply256个5*5的卷积模板卷积后的结果。

pool1后,map的size减半int(55/2)= 27,得到的本层的神经元数目为27*27*256 =186642个。

本层map数目为256个。

c. 第三个conv层(conv3)的生成过程和第二层类似,不同的是这一层是apply384个3*3的卷积模板得到的。

pool2后,map的size减半int(27/2) = 13,得到本层神经元数目为13*13*384 =64896。

本层map数目为384个。

d. 第四个conv层(conv4)是第三个conv层(conv3)进行一次ReLU(relu3)后,然后直接apply384个3*3的卷积模板得到的。

本层神经元的数目为13*13*384 = 64896。

本层map数目为384个,size还是13*13.

e.第五个conv层(conv5)与第四个生成类似,只是对上层进行了一个ReLU(relu4)后生成的,不同之处在于此处apply的卷积模板为256个3*3的。

本层神经元的数目为13*13*256 = 43264。

本层map数目为256个,size还是13*13。

f.第一个full-connected层(fc6)是上一个conv层(conv5)进行pooling(pool5)后的全连接。

pool5后,map的size减半int(13/2) =6,上层基本连接为6*6*256,然后全连接后到4096个节点,本层最终节点为4096个。

g.第二个full-connected层(fc7)是上一个full-connected(fc6)进行ReLU(relu6)后,然后进行dropout(drop6)后再进行全连接的结果

本层节点数目为4096个。

h.最后一个full-connetcted层(fc8)则是上一个full-connected层(fc7)再次进行ReLU(relu7)以及dropout(drop7)后再进行全连接的结果。最后输出为融合label的softmaxloss。

本层节点数目为1000个,对应着1000类对象。

在下面将对于AlexNet的原理进行以及算法的执行细节进行分析。
AlexNet 是一种经典的卷积神经网络(CNN)架构,在 2012 年的 ImageNet 大赛中表现优异,将 CNN 引入深度学习的新时代。该网络由 Alex Krizhevsky 等人提出,其设计在多方面改进了卷积神经网络的架构,使其能够在大型数据集上有效训练。 ### AlexNet 的架构概述 AlexNet 包含 8 层权重层,其中前 5 层为卷积层,后 3 层为全连接层。此外,卷积层之间穿插了池化层,总共包含 3 层池化层。网络结构可以简记为:卷积——池化——卷积——池化——卷积——卷积——卷积——池化——全连接——全连接——全连接 [^2]。 #### 卷积层 1. **第一层卷积层**:输入图像大小为 224x224x3,使用 96 个 11x11 的卷积核,步长为 4,输出大小为 55x55x96。 2. **第二层卷积层**:输入大小为 55x55x96,使用 256 个 5x5 的卷积核,步长为 1,输出大小为 27x27x256。 3. **第三层卷积层**:输入大小为 27x27x256,使用 384 个 3x3 的卷积核,步长为 1,输出大小为 13x13x384。 4. **第四层卷积层**:输入大小为 13x13x384,使用 384 个 3x3 的卷积核,步长为 1,输出大小为 13x13x384。 5. **第五层卷积层**:输入大小为 13x13x384,使用 256 个 3x3 的卷积核,步长为 1,输出大小为 13x13x256。 #### 池化层 池化层用于减少特征图的大小,降低计算复杂度并防止过拟合。AlexNet 使用最大池化操作,池化窗口大小为 3x3,步长为 2。 1. **第一层池化**:输入大小为 55x55x96,输出大小为 27x27x96。 2. **第二层池化**:输入大小为 27x27x256,输出大小为 13x13x256。 3. **第三层池化**:输入大小为 13x13x256,输出大小为 6x6x256。 #### 全连接层 全连接层用于分类任务,最终输出为 1000 个类别的概率分布。 1. **第六层全连接层**:输入大小为 6x6x256,展平后为 9216 个神经元,输出大小为 4096。 2. **第七层全连接层**:输入大小为 4096,输出大小为 4096。 3. **第八层全连接层**:输入大小为 4096,输出大小为 1000(ImageNet 数据集的类别数)。 ### 代码复现 以下是一个简单的 AlexNet 模型的 PyTorch 实现: ```python import torch.nn as nn class AlexNet(nn.Module): def __init__(self, num_classes=1000): super(AlexNet, self).__init__() self.features = nn.Sequential( nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), ) self.classifier = nn.Sequential( nn.Dropout(), nn.Linear(256 * 6 * 6, 4096), nn.ReLU(inplace=True), nn.Dropout(), nn.Linear(4096, 4096), nn.ReLU(inplace=True), nn.Linear(4096, num_classes), ) def forward(self, x): x = self.features(x) x = x.view(x.size(0), 256 * 6 * 6) x = self.classifier(x) return x ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值