AlexNet模型

1. 引入必要模块

import torchvision.models as models import torch.nn as nn

  • torchvision.models:包含预定义的经典模型,如 AlexNet、ResNet 等。
  • torch.nn:用于构建神经网络的模块库,包括卷积层、全连接层等。

2. 加载预定义的 AlexNet 并打印结构

alexnet = models.alexnet() print(alexnet)

  • 加载 PyTorch 提供的 AlexNet 预训练模型。
  • 打印出模型结构,帮助理解其内部组成。

3. 定义自定义的 AlexNet

class MyAlexNet(nn.Module): def __init__(self): super(MyAlexNet, self).__init__() # 层的定义

  • 创建一个自定义的 AlexNet 类,继承自 torch.nn.Module
  • super(MyAlexNet, self).__init__() 调用父类初始化函数。
3.1 定义卷积层和池化层

self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=11, stride=4, padding=2) self.pool1 = nn.MaxPool2d(3, stride=2) self.conv2 = nn.Conv2d(64, 192, 5, 1, 2) self.pool2 = nn.MaxPool2d(3, stride=2) self.conv3 = nn.Conv2d(192, 384, 3, 1, 1) self.conv4 = nn.Conv2d(384, 256, 3, 1, 1) self.conv5 = nn.Conv2d(256, 256, 3, 1, 1) self.pool3 = nn.MaxPool2d(3, stride=2) self.adapool = nn.AdaptiveAvgPool2d(output_size=6)

  • conv1conv5:5 个卷积层,分别处理输入特征。包括:
    • 通道数:输入通道和输出通道。
    • 卷积核大小:如 11×1111 \times 1111×11、5×55 \times 55×5 等。
    • 步长(stride):决定每次卷积的移动步长。
    • 填充(padding):用于保持输出特征图尺寸。
  • pool1pool3:3 个最大池化层,用于下采样特征图,减小空间维度。
  • adapool:自适应平均池化层,将特征图调整为固定尺寸 6×66 \times 66×6,简化后续全连接层的设计。

3.2 定义全连接层

self.fc1 = nn.Linear(9216, 4096) self.fc2 = nn.Linear(4096, 4096) self.fc3 = nn.Linear(4096, 1000)

  • 全连接层处理平坦化后的输入特征:
    • 9216 是由 256×6×6256 \times 6 \times 6256×6×6 计算得来。
    • 1000 表示输出类别数量(ImageNet 数据集通常有 1000 类)。
  • 这里的参数包括权重和偏置,将会参与训练。

4. 定义前向传播逻辑

def forward(self, x):

  • 定义输入 xxx 如何经过各层传播并最终生成输出。
4.1 卷积和池化部分

x = self.conv1(x) x = self.relu(x) x = self.pool1(x) x = self.conv2(x) x = self.relu(x) x = self.pool2(x) x = self.conv3(x) x = self.relu(x) print(x.size()) x = self.conv4(x) x = self.relu(x) print(x.size()) x = self.conv5(x) x = self.relu(x) x = self.pool3(x) print(x.size())

    <
### AlexNet模型结构及实现 AlexNet深度学习领域中一种经典的卷积神经网络(CNN)模型,由 Alex Krizhevsky 等人在 2012 年提出。该模型在 ImageNet 图像分类竞赛中取得了突破性成果,极大地推动了深度学习在计算机视觉领域的发展。以下是 AlexNet 的详细结构及其实现方法。 #### 一、AlexNet 模型结构详解 AlexNet 的网络结构包含多个卷积层、池化层和全连接层。具体结构如下: 1. **Conv1**:第一个卷积层,输入图像尺寸为 $227 \times 227 \times 3$,使用 11×11 的卷积核,步长为 4,输出特征图尺寸为 $55 \times 55 \times 96$[^3]。 2. **Maxpool1**:最大池化层,使用 3×3 的池化窗口,步长为 2,输出特征图尺寸为 $27 \times 27 \times 96$[^3]。 3. **Conv2**:第二个卷积层,使用 5×5 的卷积核,输出特征图尺寸为 $27 \times 27 \times 256$[^3]。 4. **Maxpool2**:最大池化层,使用 3×3 的池化窗口,步长为 2,输出特征图尺寸为 $13 \times 13 \times 256$[^3]。 5. **Conv3**:第三个卷积层,使用 3×3 的卷积核,输出特征图尺寸为 $13 \times 13 \times 384$。 6. **Conv4**:第四个卷积层,使用 3×3 的卷积核,输出特征图尺寸为 $13 \times 13 \times 384$[^3]。 7. **Conv5**:第五个卷积层,使用 3×3 的卷积核,输出特征图尺寸为 $13 \times 13 \times 256$[^3]。 8. **Maxpool3**:最大池化层,使用 3×3 的池化窗口,步长为 2,输出特征图尺寸为 $6 \times 6 \times 256$。 9. **Full connection1**:第一个全连接层,包含 4096 个神经元。 10. **Full connection2**:第二个全连接层,包含 4096 个神经元。 11. **Full connection3**:第三个全连接层,输出类别数(例如 ImageNet 数据集中的 1000 类别)。 #### 二、AlexNet 模型代码实现 以下是一个基于 PyTorch 的 AlexNet 模型实现示例: ```python import torch 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=0), 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.avgpool = nn.AdaptiveAvgPool2d((6, 6)) 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 = self.avgpool(x) x = torch.flatten(x, 1) x = self.classifier(x) return x ``` #### 三、训练方法 训练 AlexNet 模型时需要注意以下几点: 1. **数据增强**:通过随机裁剪、水平翻转等技术增加数据多样性,减少过拟合[^1]。 2. **ReLU 激活函数**:使用 ReLU 激活函数加速收敛,并避免梯度消失问题[^2]。 3. **Dropout**:在全连接层中使用 Dropout 技术防止过拟合。 4. **GPU 并行训练**:利用 GPU 加速训练过程,提高效率[^1]。 5. **局部响应归一化**:在某些卷积层后应用局部响应归一化以增强泛化能力[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值