Pytorch代码复现AlexNet

AlexNet网络架构

AlexNet整体的网络结构包括:1个输入层、5个卷积层、2个全连接层和1个输出层。

输入层(Input Layer)

AlexNet输入图像的尺寸为227*227*3,并非论文中的224*224*3

卷积层(C1)

处理流程是:卷积->ReLU->局部响应归一化->池化

卷积:输入为227*227*3,使用96个11*11*3的卷积核进行卷积,padding=0,stride=4,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(227+2*0-11)/4+1=55,得到输出是55*55*96。

ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。

局部响应归一化:局部响应归一化层简称LRN,是在深度学习中提高准确度的技术方法。一般是在激活、池化后进行。LRN对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。

LRN公式如下:

 a为归一化之前的神经元,b为归一化之后的神经元;N是卷积核的个数,也就是生成的FeatureMap的个数;k,α,β,n是超参数,论文中使用的值是k=2,n=5,α=0.0001,β=0.75。

局部响应归一化后仍为55*55*96。单个GPU上的大小为55*55*48

池化使用3*3,stride=2的池化单元进行max pooling。(55+2*0-3)/2+1=27, 输出的大小为27*27*48

卷积层(C2)

该层的处理流程是:卷积-->ReLU-->局部响应归一化(LRN)-->池化

卷积:两组输入均是27x27x48,各组分别使用128个5x5x48的卷积核进行卷积,padding=2,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(27+2*2-5)/1+1=27,得到每组输出是27x27x128。

ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。

局部响应归一化:使用参数k=2,n=5,α=0.0001,β=0.75进行归一化。每组输出仍然是27x27x128。

池化:使用3x3,stride=2的池化单元进行最大池化操作(max pooling)。注意这里使用的是重叠池化,即stride小于池化单元的边长。根据公式:(27+2*0-3)/2+1=13,每组得到的输出为13x13x128。

卷积层(C3)

该层的处理流程是: 卷积-->ReLU

卷积:输入是13x13x256,使用384个3x3x256的卷积核进行卷积,padding=1,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到输出是13x13x384。

ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。将输出其分成两组,每组FeatureMap大小是13x13x192,分别位于单个GPU上。

卷积层(C4)

该层的处理流程是:卷积-->ReLU

卷积:两组输入均是13x13x192,各组分别使用192个3x3x192的卷积核进行卷积,padding=1,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到每组FeatureMap输出是13x13x192。

ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。

卷积层(C5)

该层的处理流程是:卷积-->ReLU-->池化

卷积:两组输入均是13x13x192,各组分别使用128个3x3x192的卷积核进行卷积,padding=1,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到每组FeatureMap输出是13x13x128。

ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。

池化:使用3x3,stride=2的池化单元进行最大池化操作(max pooling)。注意这里使用的是重叠池化,即stride小于池化单元的边长。根据公式:(13+2*0-3)/2+1=6,每组得到的输出为6x6x128。

全连接层(FC6)

该层的流程为:(卷积)全连接 -->ReLU -->Dropout (卷积)

全连接:输入为6×6×256,使用4096个6×6×256的卷积核进行卷积,由于卷积核尺寸与输入的尺寸完全相同,即卷积核中的每个系数只与输入尺寸的一个像素值相乘一一对应,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(6+2*0-6)/1+1=1,得到输出是1x1x4096。既有4096个神经元,该层被称为全连接层。

ReLU:这4096个神经元的运算结果通过ReLU激活函数中。

Dropout:随机的断开全连接层某些神经元的连接,通过不激活某些神经元的方式防止过拟合。4096个神经元也被均分到两块GPU上进行运算。

全连接层(FC7)

该层的流程为:(卷积)全连接 -->ReLU -->Dropout

全连接:输入为4096个神经元,输出也是4096个神经元(作者设定的)。

ReLU<

### 使用 PyTorch 实现 AlexNet 模型 为了成功构建并训练一个类似于AlexNet卷积神经网络,可以遵循以下方法来编写Python脚本。该过程涉及定义模型架构、准备数据集以及配置训练循环。 #### 定义 AlexNet 类 在 `test.py` 文件中应当包含如下所示的类定义: ```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, 64, kernel_size=11, stride=4, padding=2), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(64, 192, kernel_size=5, padding=2), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(192, 384, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(256, 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 ``` 这段代码创建了一个名为 `AlexNet` 的新类继承自 `nn.Module` 并实现了原始论文描述的经典结构[^1]。 #### 创建模型实例 紧接着上述类定义之后,在同一文件内需增加一行用于初始化这个类的对象: ```python model = AlexNet() ``` 这一步骤至关重要,因为如果省略,则后续尝试加载已保存权重时可能会失败。 #### 加载预训练模型或继续训练 当一切就绪后,可以通过调用 `.load_state_dict()` 方法读取之前存储好的参数值到当前对象里;如果是首次启动则跳过此步直接进入训练阶段。 对于更详细的实现细节和其他辅助功能(比如优化器的选择、损失函数设定等),建议参考具体的应用场景和个人需求做适当调整。此外,可以从指定链接获取完整的源码和更多指导材料[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值