【CHM】AlexNet源代码

edwin99
edwin99
2025-03-22 06:11
160 阅读
0 评论
文章封面
目录
正在加载目录...

谷歌首席科学家 Jeff Dean 宣布,他们与计算机历史博物馆(CHM)合作,共同发布了 AlexNet 的源代码,并将长期保存这些代码。

开源GitHub 链接:https://github.com/computerhistory/AlexNet-Source-Code

 

AlexNet的定义:

AlexNet 是一个人工神经网络,用于识别照片内容。它由当时的多伦多大学研究生 Alex Krizhevsky 和 Ilya Sutskever 以及他们的导师 Geoffrey Hinton 于 2012 年开发。在计算机历史上,AlexNet 的出现有着划时代的意义。在它出现之前,很少有机器学习研究人员使用神经网络。但在 AlexNet 出现之后,几乎所有研究人员都会使用神经网络。从 2012 年到 2022 年,神经网络不断取得进步,包括合成可信的人类声音、击败围棋冠军选手、模拟人类语言并生成艺术作品…… 最终,OpenAI 于 2022 年发布 ChatGPT…… 它是这一系列故事的重要起点。

「谷歌很高兴将具有开创性意义的 AlexNet 项目的源代码贡献给计算机历史博物馆,」Jeff Dean 说,「这段代码是 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 撰写的标志性论文《ImageNet Classification with Deep Convolutional Neural Networks》的基础,该论文革新了计算机视觉领域,是有史以来被引用次数最多的论文之一。」

除了代码本身的价值,HuggingFace 联合创始人 Thomas Wolf 还发现,代码中的注释也非常有启发性。他说,「也许真正的历史记录是 AlexNet 代码中每个实验配置文件末尾的实验记录注释。一个开创性的神经网络正在诞生……」。还有人说,「AlexNet 代码的发布对于 AI 爱好者来说是一个宝库,这是一个向深度学习先驱学习的绝佳机会」。

在人工智能领域,AlexNet 可谓爆发的起点。就在本周的英伟达 GTC 大会上,黄仁勋介绍起 AI 的发展历程,未来的一头是智能体、物理世界的 AI,过去的一头就是 AlexNet。AI、机器学习、深度学习的概念可以追溯到几十年前,然而它们在过去的十几年里才真正流行起来,这可能的确要归功于 AlexNet。在 2012 年,来自多伦多大学的 Alex Krizhevsky、Ilya Sutskever、Geoffrey Hinton 等人提出了一个名为「AlexNet」的深度神经网络,赢得了 2012 年大规模视觉识别挑战赛 ImageNet 的冠军。
 

三位都是 AI 领域里响当当的人物。Geoffrey Hinton 被誉为「深度学习之父」,后来获得了 2018 年的图灵奖、2024 年的诺贝尔物理学奖;Ilya Sutskever 是 OpenAI 的联合创始人及前首席科学家,也是 AlphaGo 论文的众多作者之一。冠名该模型的 Alex Krizhevsky 也是 CIFAR-10 和 CIFAR-100 数据集的创建者,不过他却逐渐对研究失去了兴趣,于 2017 年 9 月离开了谷歌。在描述当年的 AlexNet 项目时,Geoffrey Hinton 总结道:「Ilya 认为我们应该做这件事,Alex 让它成功了,而我获得了诺贝尔奖。」

 

在 ImageNet 竞赛中,参赛者需要完成一个名叫「object region」的任务,即给定一张包含某目标的图像和一串目标类别(如飞机、瓶子、猫),每个团队的实现都需要识别出图像中的目标属于哪个类。在当年的比赛中,AlexNet 的表现颇具颠覆性,团队首次使用一种名为卷积神经网络(CNN)的深度学习架构,并充分利用了英伟达 GPU 的能力。由于表现过于惊艳,之后几年的 ImageNet 挑战赛冠军都沿用了 CNN。AlexNet 的论文被 2012 年的 NeurIPS 大会接收并发表,起初也受到了一些计算机视觉研究者的质疑,但出席会议的 Yann LeCun 宣布这是人工智能发展的转折点。后来发生的事情我们也都知道了:在 AlexNet 之前,几乎没有一篇领先的计算机视觉论文使用神经网络。在它之后,几乎所有论文都会使用神经网络。这是计算机视觉史上的一个关键时刻,也激发了人们将深度学习应用于其他领域(如自然语言处理、机器人、推荐系统)的兴趣。
AlexNet 源代码顺利发布的故事,还要从五年前说起。
 
AlexNet 源代码顺利发布的故事,还要从五年前说起。2020 年,CHM 软件历史中心馆长 Hansen Hsu 联系了 Alex Krizhevsky,希望获得发布授权。不过,Alex Krizhevsky 并没有直接回应,而是将 Hansen Hsu 介绍给了当时还在谷歌工作的 Hinton。因为,在谷歌收购了 Hinton、Sutskever 和 Krizhevsky 创办的公司 DNNresearch 之后,AlexNet 的知识产权就归了谷歌。之后,Hinton 在 CHM 和谷歌的团队之间斡旋,推动整件事的进程。双方花了五年的时间,协商发布事宜,以及具体的发布版本。事实上,自 2012 年论文发布后,AlexNet 的源码已经有了多个版本,GitHub 上也有不少名为「AlexNet」的代码库,但其中许多并不是原始代码,而是根据那篇论文重新创建的。此前,Krizhevsky 开发的 AlexNet 前身 ——cuda-convnet 也曾作为开源代码发布,但它是在较小的 CIFAR-10 数据集上训练的。

 

CHM 发布的代码库包含了 2012 年赢得 ImageNet 竞赛时的原始 AlexNet 源代码,还包括在 ImageNet 数据集上训练的参数文件。

 

AlexNet结构:

1. ‌整体架构划分

AlexNet代码库通常包含‌5个卷积层‌(含池化层)和‌3个全连接层‌的结构15。其核心组件可分为:

  • 输入预处理模块‌:处理224x224或227x227尺寸的RGB三通道图像输入1
  • 卷积-池化堆叠层‌:5组卷积+ReLU+LRN+MaxPooling组合46
  • 全连接分类模块‌:包含4096-4096-1000三层的全连接层,用于特征整合和分类5
  • 辅助功能模块‌:如Dropout层(防止过拟合)、Softmax输出层等6

2. ‌卷积层参数配置

层级 卷积核尺寸 步长 输出通道数 特殊操作
conv1 11x11 4 96 LRN+MaxPool(3x3, stride2)
conv2 5x5 1 256 LRN+MaxPool(3x3, stride2)
conv3 3x3 1 384 无池化层
conv4

3x3

1 384 无池化层
conv5

3x3

1 256 MaxPool(3x3, stride2)

3. ‌全连接层配置

层级 输入维度 输出维度 特殊操作
fc6 256x5x5 4096 ReLU+Dropout(0.5)
fc7 4096 4096 ReLU+Dropout(0.5)
fc8 4096 1000 Softmax分类

 

卷积模块定义代码(基于PyTorch):

# 卷积模块定义(对应conv1-5层)
self.conv = nn.Sequential(
    nn.Conv2d(3, 96, 11, 4),  # conv1
    nn.ReLU(),
    nn.MaxPool2d(3, 2),
    nn.Conv2d(96, 256, 5, padding=2),  # conv2
    nn.ReLU(),
    nn.MaxPool2d(3, 2),
    nn.Conv2d(256, 384, 3, padding=1),  # conv3
    nn.ReLU(),
    nn.Conv2d(384, 384, 3, padding=1),  # conv4
    nn.ReLU(),
    nn.Conv2d(384, 256, 3, padding=1),  # conv5
    nn.ReLU(),
    nn.MaxPool2d(3, 2)
)

# 全连接模块定义(对应fc6-8层)
self.fc = nn.Sequential(
    nn.Linear(256*5*5, 4096),
    nn.ReLU(),
    nn.Dropout(0.5),
    nn.Linear(4096, 4096),
    nn.ReLU(),
    nn.Dropout(0.5),
    nn.Linear(4096, num_classes)
)

代码库特殊设计

  • GPU并行‌:原始代码支持双GPU并行计算,拆分网络至两个GPU运行46
  • LRN层‌:早期版本包含局部响应归一化层,现代实现中常被BatchNorm替代47
  • 输入维度适配‌:提供多种预处理模式(224x224或227x227输入尺寸兼容)18
  • 权重初始化‌:采用特定方差的高斯分布初始化参数

 

修改AlexNet适应自己的数据集:

 

AlexNet原始输入为224x224或227x227的3通道图像。

若数据集尺寸不一致,需强制调整至标准尺寸:

transforms.Resize(256),
transforms.CenterCrop(224)

 

做通道数适配,灰度图需扩展为3通道(重复单通道数据):

nn.Conv2d(1, 96, kernel_size=11, stride=4) # 修改输入通道为1 

 

全连接层重构:

全连接层修改,替换原始1000类输出层,匹配自定义类别数(如猫狗分类需改为2类):

# 修改最后的全连接层(PyTorch)
self.classifier = nn.Sequential(
    nn.Linear(256*6*6, 4096),
    nn.ReLU(inplace=True),
    nn.Dropout(),
    nn.Linear(4096, 4096),
    nn.ReLU(inplace=True),
    nn.Dropout(),
    nn.Linear(4096, num_classes)  # num_classes为自定义类别数
)

特征维度要对齐,若输入尺寸调整导致全连接层维度异常,需重新计算展平后的维度:

# 通过公式计算展平后的维度:(W-K+2P)/S +1
fc_input = (img_size // 32)**2 * 256  # 适用于标准AlexNet池化结构

迁移学习策略:

预训练模型微调,仅训练全连接层(小数据集场景),并且部分解冻,解冻后几层卷积层(中等规模数据集):

for param in model.features.parameters():
    param.requires_grad = False

权重初始化,自定义新增层的权重需重新初始化(防止随机权重干扰)

nn.init.normal_(self.classifier[6].weight, mean=0, std=0.01)

数据增强与预处理‌:

标准化参数调整,使用自定义数据集的均值与标准差(替代ImageNet默认值)

# 计算数据集的均值和方差后配置
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])

增强策略优化,对于小数据集,增加随机裁剪、翻转、颜色抖动;对于大数据集,大数据集:简化增强以避免过拟合:

transforms.RandomHorizontalFlip(),
transforms.ColorJitter(brightness=0.2, contrast=0.2)

 

训练参数调优:调学习率,Batch_Size,优化器,Dropout率,具体看实际情况调

 

框架:最好用PyTorch,平替可以用Caffe,不要用TensorFlow

 

个人评价:13年让AI从冷板凳上抬到了最热门。Alex听说是谷歌收购后躺平财富自由了,杨立昆参与了CNN研究,但是他不待见RN,觉得是跑偏了。

 

 

 
 
 

 

 

 
 
 
 

评论区 (0)

登录后参与评论

暂无评论,抢沙发吧!