人工智能-python-深度學習-經典神經網絡AlexNet

AlexNet(詳解)——從原理到 PyTorch 實現(含訓練示例)

文章目錄

  • AlexNet(詳解)——從原理到 PyTorch 實現(含訓練示例)
  • 1. 發展歷史與比賽成績
  • 2. AlexNet 的核心思想(一句話)
  • 3. 模型結構總覽(概覽表)
  • 4. 逐層計算舉例(重點:尺寸 & 參數如何得到)
      • 例 1:Conv1 輸出尺寸(兩種常見約定)
      • 例 2:參數量計算(按層逐項示例)
  • 5. 關鍵設計點解析(為什么這些創新重要)
  • 6. PyTorch 實現(完整代碼 —— 可復制粘貼)
  • 7. 訓練與評估(實踐步驟 + 超參數建議)
  • 8. 實驗擴展(建議做的對比實驗)
  • 9. 總結

簡介(為什么寫這篇文章)
AlexNet 是 2012 年由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 提出的卷積神經網絡,它在 ILSVRC-2012 上大幅度優于當時其他方法,標志著深度學習在大規模視覺識別上的一次轉折。本文目標是:講清 AlexNet 的發展/比賽成績、核心思想與創新、逐層結構與維度/參數計算舉例,并給出一個可運行的 PyTorch 實現與訓練示例
論文地址


1. 發展歷史與比賽成績

  • 作者 / 時間:Alex Krizhevsky, Ilya Sutskever, Geoffrey Hinton,發表于 NIPS 2012(論文標題 ImageNet Classification with Deep Convolutional Neural Networks)。這是 AlexNet 的權威來源。([NeurIPS 會議錄][1])
  • 比賽成績:AlexNet 在 ILSVRC-2012 上獲得顯著勝出 —— top-5 錯誤率約 15.3%,相較第二名有非常大的優勢(原文和后續資料中有對比說明)。這次勝利推動了深度卷積網絡在計算機視覺領域的廣泛應用。([NeurIPS 會議錄][1], [維基百科][2])

2. AlexNet 的核心思想(一句話)

把較深的卷積網絡(比當時常見的淺網絡更深)、非飽和激活(ReLU)、大量數據(ImageNet)和 GPU 加速結合起來:通過 局部感受野 + 權值共享 + 下采樣(池化) 學習層次化特征,并用若干技巧(ReLU、數據增強、Dropout、局部響應歸一化等)防止過擬合與加速訓練,從而在大型圖像分類任務上取得突破。([NeurIPS 會議錄][1])


3. 模型結構總覽(概覽表)

說明:不同實現(paper vs Caffe vs torchvision)在輸入尺寸/補零細節上略有差異,常見將輸入視為 227×227×3224×224×3。下表以常見重現(Caffe/多數教程)為例,輸出大小基于 227×227(或對 224×224 做微調后也可得到相同的中間尺寸)。使用 AdaptiveAvgPool2d((6,6)) 可以避免輸入尺寸差異導致的維度問題(后面代碼中已采用)。本文中參數量計算以常見復現(final flatten = 256×6×6)為基準。([NeurIPS 會議錄][1], [多倫多大學計算機系][3])

層號層類型kernel / stride / pad輸出通道輸出尺度(示例)備注
輸入3227×227×3(或 224×224×3)先做 scale → crop
Conv1Conv 11×11, s=4, p=211×11 / 4 / 29655×55×96ReLU → LRN → MaxPool(3,2)
Pool1MaxPool 3×3, s=227×27×96
Conv2Conv 5×5, s=1, p=2, groups=25×5 / 1 / 225627×27×256ReLU → LRN → Pool
Pool2MaxPool 3×3, s=213×13×256
Conv3Conv 3×3, s=1, p=13×3 / 1 / 138413×13×384ReLU
Conv4Conv 3×3, s=1, p=1, groups=23×3 / 1 / 138413×13×384ReLU
Conv5Conv 3×3, s=1, p=1, groups=23×3 / 1 / 125613×13×256ReLU → Pool (->6×6×256)
FC6Linear40961×1×4096Dropout(0.5)
FC7Linear40961×1×4096Dropout(0.5)
FC8Linear1000logitsSoftmax / CrossEntropyLoss

注:paper 中 conv2、conv4、conv5 的“分組連接”(groups=2)設計最初出于 GPU 內存/并行的工程實現需要(在兩塊 GPU 上分別計算并部分連接),現代實現用 groups 可以在單 GPU 上復現該連接方式。([NeurIPS 會議錄][1], [PyTorch Forums][4])


4. 逐層計算舉例(重點:尺寸 & 參數如何得到)

下面先給出常用的卷積輸出公式,然后做具體示例與參數量計算。

卷積輸出尺寸公式(2D,單維):

O=?W?K+2PS?+1O = \left\lfloor\frac{W - K + 2P}{S}\right\rfloor + 1 O=?SW?K+2P??+1

其中 WWW 是輸入寬(高同理),KKK 是核大小,PPP 是 padding,SSS 是 stride,OOO 是輸出寬(或高)。


例 1:Conv1 輸出尺寸(兩種常見約定)

  • 若用 輸入 227×227,kernel=11,stride=4,pad=0,則
    O=(227?11)/4+1=55O=(227-11)/4+1=55O=(227?11)/4+1=55 → 輸出 55×55(很多 Caffe 實現采用 227);
  • 若用 輸入 224×224,但加上 pad=2(常見復現做法),kernel=11,stride=4:
    O=?(224?11+2×2)/4?+1=?217/4?+1=54+1=55O=\lfloor(224-11+2×2)/4\rfloor+1=\lfloor217/4\rfloor+1=54+1=55O=?(224?11+2×2)/4?+1=?217/4?+1=54+1=55
    因此許多實現通過加 pad=2 在 224 和 227 的差異上取得相同的 55×55 輸出(實現細節不同但邏輯等價)。([多倫多大學計算機系][3])

例 2:參數量計算(按層逐項示例)

參數(weights)數目 = out_channels × in_channels × kernel_h × kernel_w,再加上 out_channels 個偏置項(如果有 bias)。

舉幾個關鍵層(常見復現、flatten=256×6×6):

  • Conv196×3×11×11+96=34,848+96=34,94496 \times 3 \times 11 \times 11 + 96 = 34,848 + 96 = 34,94496×3×11×11+96=34,848+96=34,944 個參數。
  • Conv2(分組):paper 實現把輸入通道分到兩組(每組 48),卷積核為 5×5,輸出 256:
    參數 = 256×48×5×5+256=307,200+256=307,456256 \times 48 \times 5 \times 5 + 256 = 307,200 + 256 = 307,456256×48×5×5+256=307,200+256=307,456
  • Conv3384×256×3×3+384=885,120384 \times 256 \times 3 \times 3 + 384 = 885,120384×256×3×3+384=885,120
  • Conv4384×192×3×3+384=663,936384 \times 192 \times 3 \times 3 + 384 = 663,936384×192×3×3+384=663,936
  • Conv5256×192×3×3+256=442,624256 \times 192 \times 3 \times 3 + 256 = 442,624256×192×3×3+256=442,624
  • FC6(輸入 256×6×6=9216):4096×9216+4096=37,752,832+4096=37,756,9284096 \times 9216 + 4096 = 37,752,832 + 4096 = 37,756,9284096×9216+4096=37,752,832+4096=37,756,928
  • FC74096×4096+4096=16,781,3124096 \times 4096 + 4096 = 16,781,3124096×4096+4096=16,781,312
  • FC81000×4096+1000=4,096,000+1000=4,097,0001000 \times 4096 + 1000 = 4,096,000 + 1000 = 4,097,0001000×4096+1000=4,096,000+1000=4,097,000

把這些加起來(各層之和)大約 60,965,224 ≈ 61M 參數(paper 給出的規模約 60M 左右,和上面的逐層分解是一致的常見復現結果)。這說明:FC 層占了絕大多數參數。([Stack Overflow][5], [NeurIPS 會議錄][1])


5. 關鍵設計點解析(為什么這些創新重要)

  1. ReLU(Rectified Linear Unit):比 sigmoid/tanh 的非線性更簡單、不飽和、反向傳播梯度消失更少,訓練更快、收斂更好。AlexNet 強調 ReLU 這是性能躍升的重要因素之一。([NeurIPS 會議錄][1])
  2. Local Response Normalization (LRN):paper 中用于增強局部“競爭性”,幫助泛化(現在 BN 更常用了)。LRN 在 conv1/conv2 后使用以稍微提升精度(但現代工作中效果有限)。([NeurIPS 會議錄][1])
  3. 分組卷積(groups=2):paper 在 conv2/conv4/conv5 采用分組連接,最初是出于 “在 2 塊GTX 580 GPU 上并行訓練 / 內存受限” 的工程需要(每塊 GPU 處理一半的通道并部分連接)。現在可用 groups 在單卡上復現。([NeurIPS 會議錄][1], [PyTorch Forums][4])
  4. 重采樣/池化(overlapping pooling):AlexNet 使用 kernel=3, stride=2 的 pooling(窗口有重疊),paper 指出重疊 pooling 相比不重疊可以略微提高泛化。([NeurIPS 會議錄][1])
  5. 數據增強(包括 PCA lighting):兩種簡單但有效的數據擴增:圖像隨機裁切/左右翻轉 + RGB 空間的 PCA 顏色擾動(paper 提到),這些“廉價”的增強能極大擴充 effective dataset 并降低過擬合。([NeurIPS 會議錄][1])
  6. Dropout(FC 層):在 FC6/FC7 使用 dropout(0.5) 有效降低過擬合,顯著提高泛化。([NeurIPS 會議錄][1])

6. PyTorch 實現(完整代碼 —— 可復制粘貼)

下面給出一個**忠實還原(常見復現)**的 AlexNet PyTorch 實現(包括 LRN、groups、Dropout、AdaptiveAvgPool,適配不同輸入尺寸)。把整個代碼直接復制到你的 .py/筆記本中即可運行/微調。

# alexnet_pytorch.py
import torch
import torch.nn as nn
import torch.nn.functional as Fclass AlexNetOriginal(nn.Module):def __init__(self, num_classes=1000, dropout=0.5):super(AlexNetOriginal, self).__init__()self.features = nn.Sequential(# Conv1: 3 -> 96, kernel 11, stride 4, pad 2nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),nn.ReLU(inplace=True),nn.LocalResponseNorm(size=5, alpha=1e-4, beta=0.75, k=2.0),nn.MaxPool2d(kernel_size=3, stride=2),# Conv2: 96 -> 256, kernel 5, pad 2, groups=2 (paper used 2 GPUs)nn.Conv2d(96, 256, kernel_size=5, padding=2, groups=2),nn.ReLU(inplace=True),nn.LocalResponseNorm(size=5, alpha=1e-4, beta=0.75, k=2.0),nn.MaxPool2d(kernel_size=3, stride=2),# Conv3: 256 -> 384, kernel 3, pad 1nn.Conv2d(256, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),# Conv4: 384 -> 384, kernel 3, pad 1, groups=2nn.Conv2d(384, 384, kernel_size=3, padding=1, groups=2),nn.ReLU(inplace=True),# Conv5: 384 -> 256, kernel 3, pad 1, groups=2nn.Conv2d(384, 256, kernel_size=3, padding=1, groups=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),)# ensure fixed flatten size: use adaptive pooling -> 6x6self.avgpool = nn.AdaptiveAvgPool2d((6, 6))self.classifier = nn.Sequential(nn.Dropout(p=dropout),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplace=True),nn.Dropout(p=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)           # shape -> (N, 256, 6, 6)x = torch.flatten(x, 1)       # shape -> (N, 256*6*6)x = self.classifier(x)return x# Example: instantiate model
# model = AlexNetOriginal(num_classes=1000)
# print(model)

說明:

  • LocalResponseNorm 在 PyTorch 中可用,但在現代網絡中通常被 BN(BatchNorm)替代。
  • groups=2 用于復現原論文的分組連接;在多 GPU 時可以映射到不同設備,在單 GPU 上也能按分組工作(等價于并行的兩個卷積再 concat)。([NeurIPS 會議錄][1], [PyTorch Forums][4])

7. 訓練與評估(實踐步驟 + 超參數建議)

數據準備(paper 的處理):

  1. 將訓練圖像縮放,使短邊為 256(保持縱橫比)。
  2. 從縮放圖像提取隨機 224×224 補丁(并隨機鏡像)用于訓練;評估時使用中心裁剪(center crop)。
  3. 進行像素級的“lighting” PCA 擾動(paper 中提到的顏色主成分擾動)或使用更簡單的 ColorJitter。([NeurIPS 會議錄][1])

超參數(paper 的設置,作為起點):

  • 優化器:SGD(momentum)
  • 初始學習率:lr = 0.01(paper)
  • momentum = 0.9
  • weight_decay = 0.0005
  • batch_size = 128(如果 GPU 內存不足可降到 64/32)
  • 學習率衰減:當驗證誤差停滯時手動將 lr 降 ×0.1(paper 中總共減少 3 次,最終 lr≈1e-5)
  • 訓練輪數:paper 大約訓練 90 個 epoch(總耗時 5–6 天,用兩塊 GTX 580 GPU)。現實中通常用更強硬件或直接 fine-tune 預訓練模型。([NeurIPS 會議錄][1], [維基百科][2])

訓練代碼模板(偽代碼,關鍵點):

# 偽代碼概覽(簡化版,不含 DataLoader 構造)
model = AlexNetOriginal(num_classes=1000).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)  # 舉例for epoch in range(epochs):model.train()for images, labels in train_loader:images, labels = images.to(device), labels.to(device)logits = model(images)loss = criterion(logits, labels)optimizer.zero_grad()loss.backward()optimizer.step()# 驗證 & 學習率調整scheduler.step()# 記錄 train/val loss 與 top-1/top-5 accuracy

評估(Top-1 / Top-5):
torch.topk 可以計算 top-k 準確率;ImageNet 采用 top-1 與 top-5 指標。

可行替代(如果你資源有限):

  • 直接使用 torchvision.models.alexnet(pretrained=True) 做 fine-tune(更快、更實用)。
  • 在 CIFAR-10 / CIFAR-100 或自定義小數據集上練習,先保證實現無誤,再上大規模數據。([PyTorch Docs][6])

8. 實驗擴展(建議做的對比實驗)

  1. 激活函數對比:ReLU vs LeakyReLU vs ELU(訓練速度與最終精度比較)。
  2. 池化方式:Overlapping MaxPool(paper) vs non-overlapping vs AveragePool。
  3. BN vs LRN:在 conv 層后替換 LRN 為 BatchNorm,觀察訓練穩定性與收斂速度(BN 通常更好)。
  4. Dropout 和 權重衰減的組合:研究不同 dropout 概率和 weight_decay 對泛化影響。
  5. 數據增強:比較僅隨機裁剪/鏡像與加入 ColorJitter / PCA lighting 的效果。
  6. 優化器/學習率策略:SGD+momentum vs Adam/AdamW vs cosine lr schedule。

做這些實驗時,把對比的關鍵指標(train/val loss、top-1/top-5 accuracy、訓練時間)畫成曲線,會很直觀。


9. 總結

  • AlexNet 的成功來自于“把深度網絡 + ReLU + 大規模數據 + GPU + 一些工程技巧(數據增強、dropout、LRN、分組計算)”結合起來。它證明了深度卷積網絡在大數據集上的巨大潛力,從而推動了后續更深、更高效模型的發展(如 VGG、GoogLeNet、ResNet 等)。([NeurIPS 會議錄][1], [維基百科][2])
  • 實踐建議:若只想快速上手并取得良好結果,優先選擇 預訓練模型 + 微調;若目標是理解與復現原論文,按本文給出的實現與訓練超參做實驗并記錄對比會很有收獲。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96274.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《sklearn機器學習——指標和評分1》

3個不同的API可供評估模型預測質量: 評估器評分方法:評估器有一個score方法,它給計劃解決的問題提供一個初始評估標準。這部分內容不在這里討論,但會出現在每一個評估器的文件中。 評分參數:使用交叉驗證(…

人工智能中的線性代數總結--簡單篇

numpy庫中的dot函數來計算矩陣和向量的點積def matrix_vector_dot_product(a, b):import numpy as npif (len(a[0]) ! len(b)):return -1# 使用tolist()將結果轉換為列表return np.dot(a, b).tolist()原始方法def matrix_vector_dot_product(matrix, vector):if len(matrix[0])…

又是全網首創/純Qt實現28181設備模擬器/rtp視頻點播/桌面轉28181/任意文件轉28181/跨平臺

一、前言說明 這個工具前前后后也算是廢了不少功夫,最開始是因為28181服務端的組件已經完美實現,對照國標文檔看了很多遍,逐個實現需要的交互協議,整體上比onvif協議要難不少,主要是涉及到的東西比較多,有…

安卓逆向(一)Ubuntu環境配置

一、Ubuntu 1、虛擬機 首先準備一個Ubuntu的虛擬機,就隨便新建一個就行,我這里使用的是Ubuntu21.04,但是內存跟硬盤大小最好設置的稍微大一點。 2、基礎環境 (1)解決apt-get update報錯問題 apt-get是Linux系統中一個管…

Go 1.25在性能方面做了哪些提升?

Go 1.25 在性能方面帶來了多項重要提升,主要有以下幾個方面: 實驗性垃圾回收器 GreenTea GC:針對小對象密集型應用優化,顯著提升小對象標記和掃描性能,垃圾回收開銷減少0-40%,暫停時間縮短,吞吐…

Python與XML文件處理詳解(2續):xml.dom.minidom模塊高階使用方法

目錄 第一部分:高級節點操作與遍歷方法 1.1 更精確的節點導航 1.2 使用 cloneNode() 復制節點 1.3 節點插入、替換與高級管理 第二部分:文檔創建與高級輸出控制 2.1 使用 Document 工廠方法完整創建文檔 2.2 高級輸出與序列化控制 第三部分:實用工具函數與模式處理 …

如何利用 ChatGPT 輔助寫作

引言 介紹人工智能輔助寫作的興起,ChatGPT 在寫作領域的應用潛力,以及本文的核心目標。 ChatGPT 在寫作中的核心功能 概述 ChatGPT 的主要功能,包括文本生成、潤色、結構優化、靈感激發等。 利用 ChatGPT 輔助寫作的具體方法 生成創意與靈感 …

【有鹿機器人自述】我在社區的365天:掃地、賣萌、治愈人心

大家好,我是有鹿巡掃機器人,編號RD-07。今天我想和大家分享這一年來的工作見聞——沒錯,我們機器人也會"觀察"和"感受",尤其是在連合直租將我送到這個社區后,發生的點點滴滴讓我擁有了前所未有的&…

第五十五天(SQL注入增刪改查HTTP頭UAXFFRefererCookie無回顯報錯復盤)

#數據庫知識: 1、數據庫名,表名,列名,數據 2、自帶數據庫,數據庫用戶及權限 3、數據庫敏感函數,默認端口及應用 4、數據庫查詢方法(增加刪除修改更新) #SQL注入產生原理&#xf…

怎么用 tauri 創建一個桌面應用程序(Electron)

以前用 Electron 做過一個桌面應用程序,打包體積確實很大,啟動也很慢。這次先 tauri。 并且用 bun 代替 npm 速度更快,避免總是出現依賴問題。 前端用 react 為了學習下,用 js 先現在主流的 typescript。 安裝 bun npm instal…

【通過Docker快速部署Tomcat9.0】

文章目錄前言一、部署docker二、部署Tomcat2.1 創建存儲卷2.2 運行tomcat容器2.3 查看tomcat容器2.4 查看端口是否監聽2.5 防火墻開放端口三、訪問Tomcat前言 Tomcat介紹 Tomcat 是由 Apache 軟件基金會(Apache Software Foundation)開發的一個開源 Jav…

LabVIEW UI 分辨率適配

針對 LabVIEW UI 在不同分辨率下的適配,現有方案分三類:一是現有 VI 可通過 “VI 屬性 - 窗口大小” 勾選比例保持或控件縮放選項快速調整,也可取消勾選或換等寬字體防控件移位;二是項目初期以最低目標分辨率為基準,用…

國產化FPGA開發板:2050-基于JFMK50T4(XC7A50T)的核心板

(IEB-PS-3051-郵票孔) 一、核心板概述 板卡基于JFMK50T4國產化FPGA芯片,設計的一款工業級核心板,板卡集成主芯片、電源、DDR、配置芯片,大大減輕客戶的擴展開發困難。豐富的IO和4個GTP,讓用戶輕…

Webpack 核心原理剖析

時至今日,Webpack 已迭代到 5.x 版本,其功能模塊的擴充和復雜度的提升使得源碼學習成本陡增。官方文檔的晦澀表述更是讓許多開發者望而卻步。然而,理解 Webpack 的核心原理對優化構建流程、定制化打包方案至關重要。本文將通過簡化流程和代碼…

移植Qt4.8.7到ARM40-A5

移植Qt4.8.7到ARM40-A5 主機平臺:Ubuntu 16.04 LTS(x64) 目標平臺:ARM40-A5 Qt版本:Qt4.8.7 ARM GCC編譯工具鏈: arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 ----------## Qt移植步驟 ## 1、了解Ubuntu&am…

C++_哈希

1. unordered系列關聯式容器在C98中,STL提供了底層為紅黑樹結構的一系列關聯式容器,在查詢時效率可達到$log_2 N$,即最差情況下需要比較紅黑樹的高度次,當樹中的節點非常多時,查詢效率也不理想。最好 的查詢是&#xf…

Redis 內存管理機制:深度解析與性能優化實踐

🧠 Redis 內存管理機制:深度解析與性能優化實踐 文章目錄🧠 Redis 內存管理機制:深度解析與性能優化實踐🧠 一、Redis 內存架構全景💡 Redis 內存組成結構📊 內存占用分布示例?? 二、內存分配…

cargs: 一個輕量級跨平臺命令行參數解析庫

目錄 1.簡介 2.安裝與集成 3.項目的目錄結構及介紹 4.核心數據結構與函數 5.基本使用示例 6.應用案例和最佳實踐 7.高級用法 8.與其他庫的對比 9.總結 1.簡介 cargs 是一個輕量級、無依賴的 C 語言命令行參數解析庫,雖然本身是 C 庫,但可以無縫…

【數學建模】質量消光系數在煙幕遮蔽效能建模中的核心作用

前言:歡迎各位光臨本博客,這里小編帶你直接手撕質量相關系數,文章并不復雜,愿諸君耐其心性,忘卻雜塵,道有所長!!!! **🔥個人主頁:IF’…

Java代碼審計實戰:XML外部實體注入(XXE)深度解析

Java代碼審計實戰:XML外部實體注入(XXE)深度解析XML外部實體注入(XXE)是Web應用程序中一種常見但又常常被忽視的漏洞。它利用了XML解析器解析XML文檔時,允許引用外部實體這個特性。如果解析器沒有禁用外部實…