【Pytorch学习笔记】模型模块08——AlexNet模型详解

news2025/6/6 21:13:26

AlexNet模型详解:结构、算法与PyTorch实现

一、AlexNet模型结构

AlexNet是2012年ImageNet竞赛冠军模型,由Alex Krizhevsky等人提出,标志着深度学习在计算机视觉领域的突破。

网络结构(5卷积层 + 3全连接层):

graph LR
    A[输入图像 227×227×3] --> B[Conv1]
    B --> C[ReLU]
    C --> D[MaxPool]
    D --> E[Norm1]
    E --> F[Conv2]
    F --> G[ReLU]
    G --> H[MaxPool]
    H --> I[Norm2]
    I --> J[Conv3]
    J --> K[ReLU]
    K --> L[Conv4]
    L --> M[ReLU]
    M --> N[Conv5]
    N --> O[ReLU]
    O --> P[MaxPool]
    P --> Q[FC6]
    Q --> R[ReLU]
    R --> S[Dropout]
    S --> T[FC7]
    T --> U[ReLU]
    U --> V[Dropout]
    V --> W[FC8]
    W --> X[Softmax]

各层参数详情:

层类型参数配置输出尺寸激活函数特殊操作
输入层-227×227×3--
卷积层196@11×11, stride=4, pad=055×55×96ReLU-
最大池化3×3, stride=227×27×96--
LRN-27×27×96-局部响应归一化
卷积层2256@5×5, stride=1, pad=227×27×256ReLU-
最大池化3×3, stride=213×13×256--
LRN-13×13×256-局部响应归一化
卷积层3384@3×3, stride=1, pad=113×13×384ReLU-
卷积层4384@3×3, stride=1, pad=113×13×384ReLU-
卷积层5256@3×3, stride=1, pad=113×13×256ReLU-
最大池化3×3, stride=26×6×256--
全连接64096神经元4096ReLUDropout(0.5)
全连接74096神经元4096ReLUDropout(0.5)
全连接81000神经元1000--
输出层Softmax1000--

二、核心算法创新

  1. ReLU激活函数

    • 替代传统的tanh/sigmoid函数
    • 优点:计算简单,缓解梯度消失问题
    • 公式: f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
  2. 局部响应归一化(LRN)

    • 模拟生物神经系统的侧抑制机制
    • 增强大响应值,抑制小响应值
    • 公式:
      b x , y i = a x , y i / ( k + α ∑ j = max ⁡ ( 0 , i − n / 2 ) min ⁡ ( N − 1 , i + n / 2 ) ( a x , y j ) 2 ) β b_{x,y}^i = a_{x,y}^i / \left(k + \alpha \sum_{j=\max(0,i-n/2)}^{\min(N-1,i+n/2)} (a_{x,y}^j)^2 \right)^\beta bx,yi=ax,yi/ k+αj=max(0,in/2)min(N1,i+n/2)(ax,yj)2 β
    • 其中: N N N为通道总数, n n n为局部邻域大小, k , α , β k,\alpha,\beta k,α,β为超参数
  3. 重叠池化(Overlapping Pooling)

    • 使用步长(stride)小于池化窗口尺寸
    • 3×3池化窗口,stride=2
    • 提升特征丰富性,减少过拟合
  4. Dropout正则化

    • 训练时随机丢弃50%神经元
    • 防止过拟合,增强模型泛化能力
    • 相当于模型集成效果
  5. 数据增强

    • 随机裁剪、水平翻转、颜色变换
    • 大幅增加训练数据多样性

三、PyTorch底层实现分析

完整AlexNet实现代码(PyTorch风格)

import torch.nn as nn

class AlexNet(nn.Module):
    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        self.features = nn.Sequential(
            # Conv1
            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            
            # Conv2
            nn.Conv2d(64, 192, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            
            # Conv3
            nn.Conv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            
            # Conv4
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            
            # Conv5
            nn.Conv2d(256, 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

关键实现细节分析

  1. 卷积层实现

    • nn.Conv2d参数解析:
      nn.Conv2d(in_channels, out_channels, 
                kernel_size, stride=1, 
                padding=0, dilation=1, 
                groups=1, bias=True)
      
    • 第一层卷积计算示例:
      # 输入: (227, 227, 3)
      # 计算: (227 - 11 + 2*0)/4 + 1 = 55 → 输出: (55, 55, 96)
      
  2. LRN的现代替代

    • 原始AlexNet使用LRN
    • PyTorch实现省略了LRN层(现代网络通常用BatchNorm替代)
    • 如需实现LRN:
      nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2)
      
  3. 自适应平均池化

    • nn.AdaptiveAvgPool2d((6, 6))确保不同尺寸输入统一为6×6
    • 替代原始固定尺寸计算,增强灵活性
  4. Dropout实现

    • 全连接层前添加nn.Dropout(p=0.5)
    • 仅训练时激活,测试时自动关闭
  5. 参数初始化

    • 最佳实践:使用Xavier初始化
    for m in self.modules():
        if isinstance(m, nn.Conv2d):
            nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
            if m.bias is not None:
                nn.init.constant_(m.bias, 0)
        elif isinstance(m, nn.Linear):
            nn.init.normal_(m.weight, 0, 0.01)
            nn.init.constant_(m.bias, 0)
    

四、PyTorch调用方法

1. 使用预训练模型

import torchvision.models as models

# 加载预训练模型
alexnet = models.alexnet(weights='AlexNet_Weights.IMAGENET1K_V1')

# 设置为评估模式
alexnet.eval()

2. 自定义训练

from torchvision import datasets, transforms
import torch.optim as optim

# 数据预处理
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], 
                         std=[0.229, 0.224, 0.225])
])

# 加载数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, 
                                download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, 
                                          batch_size=64, 
                                          shuffle=True)

# 初始化模型
model = AlexNet(num_classes=10)  # 修改为CIFAR-10的10分类

# 损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

# 训练循环
for epoch in range(10):
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

3. 模型预测示例

from PIL import Image

# 预处理图像
img = Image.open("test_image.jpg")
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], 
                         std=[0.229, 0.224, 0.225])
])
input_tensor = preprocess(img)
input_batch = input_tensor.unsqueeze(0)  # 增加batch维度

# 预测
with torch.no_grad():
    output = alexnet(input_batch)

# 获取预测结果
_, predicted_idx = torch.max(output, 1)
print(f"Predicted class index: {predicted_idx.item()}")

五、现代改进建议

  1. LRN替代方案:使用Batch Normalization替代LRN
  2. 全连接层优化:减少全连接层参数(原始占模型参数90%+)
  3. 小尺寸适配:对于小尺寸图像(如CIFAR),修改第一层:
    nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)  # 替代11×11卷积
    
  4. 学习率调整:使用学习率衰减策略(如StepLR)
  5. 正则化增强:添加权重衰减(L2正则化)

AlexNet作为深度学习里程碑模型,其设计思想(ReLU、Dropout、数据增强等)深刻影响了后续CNN架构发展。虽然现代网络性能已超越AlexNet,但其核心创新仍是深度学习课程的重要学习内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW自感现象远程实验平台

LabVIEW开发自感现象远程实验平台,通过整合 NI数据采集设备、菲尼克斯(Phoenix Contact)继电器模块及罗技(Logitech)高清摄像头,实现远程数据采集、仪器控制与实时监控三大核心功能。平台突破传统实验装置局…

Python----目标检测(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理与网络结构)

一、《YOLOv3:AnIncrementalImprovement》 1.1、基本信息 标题:YOLOv3: An Incremental Improvement 作者:Joseph Redmon, Ali Farhadi 机构:华盛顿大学(University of Washington) 发表时间:2018年 代…

算法篇 八大排序(冒泡 插入 选择 堆 希尔 快排 归并 计数)

目录 引言 1.冒泡排序 思路 代码实现 2.选择排序 思路 代码实现(存在易错点) 3.插入排序 思路 代码实现 4.希尔排序 思路 代码实现 5.堆排序 思路 代码实现 6.快速排序(快排) 一.三路划分 思路 代码实现 二.自…

音视频之视频压缩编码的基本原理

系列文章: 1、音视频之视频压缩技术及数字视频综述 2、音视频之视频压缩编码的基本原理 一、预测编码: 1、预测编码的基本概念: 预测法是最简单、实用的视频压缩编码方法,经过压缩编码后传输的并不是像素本身的取样值&#xff0…

IDEA 包分层显示设置

方法一(用的IntelliJ IDEA 2024.1.4版本): 找到项目视图设置入口:在左侧Project(项目)面板的顶部,有个三个点...的按钮 ,点击它。 进入树形外观配置:在弹出的菜单中&…

深度学习和神经网络 卷积神经网络CNN

1.什么是卷积神经网络 一种前馈神经网络;受生物学感受野的机制提出专门处理网格结构数据的深度学习模型 核心特点:通过卷积操作自动提取空间局部特征(如纹理、边缘),显著降低参数量 2.CNN的三个结构特征 局部连接&a…

PlayWright | 初识微软出品的 WEB 应用自动化测试框架

Playwright是微软大厂背书的跨平台 WEB 应用自动化测试框架,支持多开发语言(TypeScript、JavaScript、.Net、Python、Java)及多浏览器(Chromium、WebKit、Firefox),同时支持移动端测试。 安装 playwright …

Mac电脑_钥匙串操作选项变灰的情况下如何删除?

Mac电脑_钥匙串操作选项变灰的情况下如何删除? 这时候 可以使用相关的终端命令进行操作。 下面附加文章《Mac电脑_钥匙串操作的终端命令》。 《Mac电脑_钥匙串操作的终端命令》 (来源:百度~百度AI 发布时间:2025-06)…

2025前端微服务 - 无界 的实战应用

遇饮酒时须饮酒,得高歌处且高歌 文章目录 什么是前端微服务主流框架概述无界 - 腾讯乾坤 - 阿里Micro-app Vue3项目引用⑴. 项目依赖安装⑵. main.ts 文件配置⑶. 路由配置⑷. 页面设置 隐藏子应用菜单及顶部信息栏子应用样式冲突问题虚拟路由⑴. 路由⑵. 页面 跨域…

【设计模式-4.8】行为型——中介者模式

说明:本文介绍行为型设计模式之一的中介者模式 定义 中介者模式(Mediator Pattern)又叫作调节者模式或调停者模式。用一个中介对象封装一系列对象交互,中介者使各对象不需要显式地互相作用,从而使其耦合松散&#xf…

行列式的性质

1 行列式使用如下性质定义 1)单位矩阵行列式值为 1, ,对于任意单位矩阵均成立; 2)当矩阵交换一行后,行列式值改变符号,如置换矩阵的行列式值为 (根据行交换次数决定)&…

联软NSPM自动化策略管理 助力上交所加速国产化替代提升运维效率

在金融行业核心基础设施国产化浪潮与网络安全强监管的双重背景下,上海证券交易所(以下简称“上交所”)积极拥抱变革,携手长期合作伙伴联软科技,成功部署了联软安全策略管理系统(NSPM)。该项目不…

Flask + ECharts+MYSQL物联网数字化大屏

基于Flask+ECharts的物联网数字化大屏系统,包含中国地图实时数据更新功能。这个系统模拟了物联网设备在全国范围内的分布和运行状况,并实时更新数据。 一、系统架构设计 技术栈 后端:Flask(轻量级路由+API支持) 前端:ECharts(地图+动态图表)、WebSocket(实时更新)…

数据库系统概论(十六)数据库安全性(安全标准,控制,视图机制,审计与数据加密)

数据库系统概论(十六)数据库安全性 前言一、数据库安全性1. 什么是数据库安全性?2. 为何会存在安全问题? 二、安全标准的发展1. 早期的“开拓者”:TCSEC标准2. 走向国际统一:CC标准3. TCSEC和CC标准有什么不…

vue3从入门到精通(基础+进阶+案例)

Vue是什么? 渐进式JavaScript框架,易学易用,性能出色,适用场景丰富的Web前端框架 为什么要学习Vue Vue是目前前端最火的框架之一 Vue是目前企业技术栈中要求的知识点 Vue可以提升开发体验 。。。 Vue简介 Vue(发音为/vju/,…

【Linux 学习计划】-- 系统中进程是如何调度的(内核进程调度队列)

目录 回顾进程优先级与进程调度的引入 内核runqueue图例 关于queue[140]前100个位置 | 实时进程与分时进程 遍历需要调度的进程与bitmap的引入 active、expired指针 结语 回顾进程优先级与进程调度的引入 在我们之前的学习中,我们是有学习过进程优先级这个概…

C#、VB.net——如何设置窗体应用程序的外边框不可拉伸

以Visual studio 2015为例,具体操作如下: 1、将窗体的“FormBorderStyle”属性值修改为“FixedSingle”: 2、点击“格式”——“锁定控件”: 这样生成的程序边框即可固定住,无法拉伸。

基于SpringBoot的房屋租赁系统的设计与实现(thymeleaf+MySQL)

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Spring Boot统一功能处理深度解析

第一章:为什么需要统一功能处理? 想象你正在开发一个电商系统,包含用户管理、商品管理、订单管理等模块。每个模块都需要: 用户身份验证操作日志记录异常统一处理数据格式标准化 如果每个模块都单独实现这些功能: …

世事无常,比较复杂,人可以简单一点

2025年6月5日日,17~28℃,一般 待办: 宣讲会 职称材料的最后检查 职称材料有错误,需要修改 期末考试试题启用 教学技能大赛PPT 遇见:部门宣传泰国博士项目、硕士项目、本科项目。 感受或反思:东南亚博士…