谷歌首席科学家 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…… 它是这一系列故事的重要起点。
除了代码本身的价值,HuggingFace 联合创始人 Thomas Wolf 还发现,代码中的注释也非常有启发性。他说,「也许真正的历史记录是 AlexNet 代码中每个实验配置文件末尾的实验记录注释。一个开创性的神经网络正在诞生……」。还有人说,「AlexNet 代码的发布对于 AI 爱好者来说是一个宝库,这是一个向深度学习先驱学习的绝佳机会」。
三位都是 AI 领域里响当当的人物。Geoffrey Hinton 被誉为「深度学习之父」,后来获得了 2018 年的图灵奖、2024 年的诺贝尔物理学奖;Ilya Sutskever 是 OpenAI 的联合创始人及前首席科学家,也是 AlphaGo 论文的众多作者之一。冠名该模型的 Alex Krizhevsky 也是 CIFAR-10 和 CIFAR-100 数据集的创建者,不过他却逐渐对研究失去了兴趣,于 2017 年 9 月离开了谷歌。在描述当年的 AlexNet 项目时,Geoffrey Hinton 总结道:「Ilya 认为我们应该做这件事,Alex 让它成功了,而我获得了诺贝尔奖。」
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,觉得是跑偏了。