卷积神经网络模型之——AlexNet网络结构与代码实现

卷积神经网络模型之——AlexNet网络结构与代码实现AlexNet 原文地址 https proceedings neurips cc paper 2012 file cd3b9d6b76c8 Paper pdfAlexNet 诞生于 2012 年 由 2012 年 ImageNet 竞赛冠军获得者 Hinton 和他的学生 AlexKrizhevs 设计的 AlexNet 的贡献点 首次使用 GPU 加速网络训练使用 ReLU 激活函数 代替不是传统的 Sigmoid 和 Tanh 解决了 Sigmoid 的梯度消失问题 使收敛更快 训练时使用

AlexNet简介

AlexNet的贡献点:

  • 首次使用GPU加速网络训练
  • 使用ReLU激活函数,代替不是传统的Sigmoid和Tanh,解决了Sigmoid的梯度消失问题,使收敛更快。
    在这里插入图片描述
  • 训练时使用Dropout随机忽略一部分神经元,以减少模型过拟合。
    在这里插入图片描述
  • 使用了LRN局部响应归一化提高准确率。
  • 在CNN中使用重叠的最大池化,提升了特征的丰富性。

AlexNet网络结构解析

卷积层1(Conv + ReLU + MaxPool)

在这里插入图片描述
Conv1使用卷积核大小为11,步距为4,padding为2。
输入大小:【3,224,224】
输出大小:【48,55,55】
N = (W-F+2P)/ S + 1 = (224-11+2*2)/4+1=55。



卷积之后跟着一个ReLU激活,激活之后接着一个最大池化上采样,池化核大小为3,步距为2,池化后输出大小为【48,27,27】。

PyTorch表述本层为:

# input[3, 224, 224]  nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2), # output[48, 55, 55] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[48, 27, 27] 

卷积层2(Conv + ReLU + MaxPool)

在这里插入图片描述

卷积之后跟着一个ReLU激活,激活之后接着一个最大池化上采样,池化核大小为3,步距为2,池化后输出大小为【128,13,13】。

PyTorch表述本层为:

# input[48,27,27]  nn.Conv2d(48, 128, kernel_size=5, padding=2), # output[128, 27, 27] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[128, 13, 13] 

卷积层3(Conv + ReLU )

在这里插入图片描述
Conv3使用卷积核大小为3,步距为1,padding为1。
输入大小:【128, 13, 13】
输出大小:【192,13,13】
N = (W-F+2P)/ S + 1 = (13-3+1*2)/1+1=13。



卷积之后跟着一个ReLU激活,没有池化。

PyTorch表述本层为:

# input[128, 13, 13]  nn.Conv2d(128, 192, kernel_size=3, padding=1), # output[192, 13, 13] nn.ReLU(inplace=True), 

卷积层4(Conv + ReLU )

在这里插入图片描述

卷积之后跟着一个ReLU激活,没有池化。

PyTorch表述本层为:

# input[192, 13, 13]  nn.Conv2d(192, 192, kernel_size=3, padding=1), # output[192, 13, 13] nn.ReLU(inplace=True), 

卷积层5(Conv + ReLU + MaxPool)

在这里插入图片描述

卷积之后跟着一个ReLU激活,激活之后接着一个最大池化上采样,池化核大小为3,步距为2,池化后输出大小为【128,6,6】。

PyTorch表述本层为:

# input[192, 13, 13]  nn.Conv2d(192, 128, kernel_size=3, padding=1), # output[128, 13, 13] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[128, 6, 6] 

第5个卷积层之后,就是三个全连接层。

FC1

在这里插入图片描述
全连接FC1之前先进行一次Dropout。

FC1之后进行一次ReLU激活。

PyTorch表述本层为:

nn.Dropout(p=0.5), nn.Linear(128 * 6 * 6, 2048), nn.ReLU(inplace=True), 

FC2

在这里插入图片描述

全连接FC2之前先进行一次Dropout。

FC1之后进行一次ReLU激活。

PyTorch表述本层为:

nn.Dropout(p=0.5), nn.Linear(2048, 2048), nn.ReLU(inplace=True), 

FC3

在这里插入图片描述

nn.Linear(2048, 1000), 

使用PyTorch搭建AlexNet网络结构

前面在网络结构解析的时候,都已经给出了每一层的代码表述。

init

这里我们使用nn.Sequential将5个卷积层放在一起,定义为features(义为提取特征);将3个全连接层放在一起,定义为classifier(义为分类)。

def __init__(self): super(AlexNet, self).__init__() self.features = nn.Sequential( nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2), # output[48, 55, 55] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[48, 27, 27] nn.Conv2d(48, 128, kernel_size=5, padding=2), # output[128, 27, 27] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[128, 13, 13] nn.Conv2d(128, 192, kernel_size=3, padding=1), # output[192, 13, 13] nn.ReLU(inplace=True), nn.Conv2d(192, 192, kernel_size=3, padding=1), # output[192, 13, 13] nn.ReLU(inplace=True), nn.Conv2d(192, 128, kernel_size=3, padding=1), # output[128, 13, 13] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[128, 6, 6] ) self.classifier = nn.Sequential( nn.Dropout(p=0.5), nn.Linear(128 * 6 * 6, 2048), nn.ReLU(inplace=True), nn.Dropout(p=0.5), nn.Linear(2048, 2048), nn.ReLU(inplace=True), nn.Linear(2048, num_classes), ) 

forward

然后定义正向传播过程

def forward(self, x): x = self.features(x) # 5个卷积层 x = torch.flatten(x, start_dim=1) # 将3维展平成一维,进行全连接 x = self.classifier(x) # 3个全连接层 return x 

完整代码

class AlexNet(nn.Module): def __init__(self): super(AlexNet, self).__init__() self.features = nn.Sequential( nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2), # output[48, 55, 55] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[48, 27, 27] nn.Conv2d(48, 128, kernel_size=5, padding=2), # output[128, 27, 27] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[128, 13, 13] nn.Conv2d(128, 192, kernel_size=3, padding=1), # output[192, 13, 13] nn.ReLU(inplace=True), nn.Conv2d(192, 192, kernel_size=3, padding=1), # output[192, 13, 13] nn.ReLU(inplace=True), nn.Conv2d(192, 128, kernel_size=3, padding=1), # output[128, 13, 13] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[128, 6, 6] ) self.classifier = nn.Sequential( nn.Dropout(p=0.5), nn.Linear(128 * 6 * 6, 2048), nn.ReLU(inplace=True), nn.Dropout(p=0.5), nn.Linear(2048, 2048), nn.ReLU(inplace=True), nn.Linear(2048, 1000), ) def forward(self, x): x = self.features(x) x = torch.flatten(x, start_dim=1) x = self.classifier(x) return x model = AlexNet(); print(model) 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230334.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月4日 下午8:01
下一篇 2026年3月4日 下午8:22


相关推荐

  • zookeeper入门教程_入门教程

    zookeeper入门教程_入门教程zookeeperwatcher架构zookeeper 配置中心分布式ID分布式锁集群搭建数据一致性协议:zab协议Zookeeper Leader选举Observer角色及其配置watcher架构客户端首先将Watcher注册到服务器,同时将Watch对象保存到客户端的Watch管理器中。当Zookeeper服务器监听到的数据发生变化时,服务器会通知客户端,接着客户端的Watch管理器会触发相关的Watcher来回调响应处理逻辑,从而完成整体的数据发布/订阅流程。javaAPIJava

    2022年8月9日
    6
  • 卡巴斯基kav为什么总提示程序已经断开连接「建议收藏」

    卡巴斯基kav为什么总提示程序已经断开连接「建议收藏」用着用着就出现了程序已经断开连接的提示.要求重启产品.请问为什么会这样?该如何解决?这是KIS的一个BUG,我也遇到过。与楼上说的授权啊地震啊都没有关系。下载新版本的KIS就能解决。http://www.kpfans.com/bbs/index.php这是卡巴斯基爱好者论坛,里面有几乎有所有的新旧版本。 

    2022年8月20日
    9
  • Lombok插件讲解

    Lombok插件讲解Lombok 是什么 lombok 是 java 自动生成代码的插件 它能提高开发效率 减少自己编写繁琐的代码 让代码看起来更整洁简略 比如 getter setter equals 以及 construct 等方法 其也有 val var 这种自动判断变量类型的变量定义方式 类似 javascript 中的 let const Lombok 使用在开发 ide 中安装 lombok 插件 然后加上 lombok 的依赖包

    2026年3月18日
    2
  • c++ priority queue_priority

    c++ priority queue_priority既然是队列那么先要包含头文件#include<queue>优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的定义:priority_queue<Type,Container,Functional>Type就是数据类型,Container就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用

    2025年8月24日
    10
  • numpy tolist()的用法

    numpy tolist()的用法1 将数组或者矩阵转换成列表如下 fromnumpyimp a1 1 2 3 4 5 6 a1 是列表 a2 array a1 列表 数组 a2array 1 2 3 4 5 6 a3 mat a1 列表 矩阵 a3matrix 1 2

    2026年3月19日
    3
  • 携牵引力之手,与编程到老!

    携牵引力之手,与编程到老!

    2022年3月13日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号