1.LeNet的原始實驗數據集MNIST
名稱:MNIST手寫數字數據集
數據類型:灰度圖 (一通道)
圖像大小:28*28
類別數:10類(數字0-9)
1.通過torchvision.datasets.MNIST下載并保存到本地為JPEG圖片:
下載數據集并保存圖片形式(download_mnist.py)
庫:sys,os,tqdm
圖片命名的格式為:子數據集名_在子數據集中的編號_真實值標簽。
圖片大小:28*28
?2.使用gzip解析MNIST數據集文件parse_mnist.py
MNIST的圖片和標簽均通過二進制文件進行保存(.gz),無法直接在Windows中查看手寫數字的圖片和標簽,通過gzip解壓,轉換為numpy數組。
將標簽數據轉換為one-hot編碼:將每個標簽轉換為一個向量,其中該標簽對應的索引位置為 1,其他位置為 0。
one-hot編碼
將類別標簽轉化為一個 長度為類別數的二進制向量,每個類別的位置對應為 1,其它位置為 0。
one-hot編碼
將類別標簽轉化為一個 長度為類別數的二進制向量,每個類別的位置對應為 1,其它位置為 0。
- 數字 0 →
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- 數字 1 →
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
- 數字 2 →
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
3、預處理數據集(prepare_data.py)
調用parse_mnist函數對原始的mnist數據進行解析,創建數據加載器train_loader
- 歸一化:將加載的圖像數據除以 255.0,將圖像的像素值從 [0, 255] 范圍縮放到 [0, 1]。
- 轉換為 Tensor:將NumPy 數組轉換為 PyTorch 的 Tensor 。
- 重塑圖像:將圖像數據從 28x28 的二維數組重塑為符合神經網絡輸入要求的形狀 (-1, 1, 28, 28)。
- 創建數據集和數據加載器:
train_dataset = TensorDataset(train_image, train_label)
#TensorDataset:數據集類,將圖像和標簽數據封裝成一個數據集
train_loader=(train_dataset,batch_size=64,shuffle=True)
#DataLoader:數據加載器類,數據集分成小批次,shuffle=True可打亂
2.LeNet神經網絡模型
公式
1.N = (W-F+2P)/S+1
卷積后尺寸=(輸入-卷積核+加邊像素數)/步長 +1
用于計算卷積層/池化層輸出的尺寸,參數含義:
N:輸出特征圖的大小
W:輸入特征圖的大小
F:卷積核的大小(5*5)
P:填充(padding)的大小,表示在輸入的邊緣填充多少像素
S: 步長(stride),卷積核每次滑動的步幅
2.輸出通道數 = 卷積核組數量
輸入通道數=上一層的輸出通道數
卷積層通道數逐漸增加
3.輸出圖像尺度計算
N = (W-F+2P)/S+1
- 第一層:C1卷積層
輸入:28*28*1
參數:self.c1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2,stride=1)
輸出:28*28*6(padding=2寬高不變,通道數為6)
- 第二層:S2池化層(使圖像尺寸減半)
輸入:28*28*6
參數:self.s2 = nn.AvgPool2d(kernel_size=2, stride=2,padding=0)
池化核大小默認等于步長,使輸出大小是輸入大小的一半
輸出:14*14*6
- 第三層:C3卷積層
輸入:14*14*6
參數:self.c3 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5,padding=0,stride=1)
輸出:10*10*16
- 第四層:S4池化層
輸入:10*10*16
參數:self.s4 = nn.AvgPool2d(kernel_size=2, stride=2)
輸出:5*5*16
- 第五層:C5卷積層
輸入:5*5*16
參數self.c5 = nn.Conv2:d(in_channels=16, out_channels=120, kernel_size=5,padding=0,stride=1)
輸出:1*1*120
概念
卷積層
卷積核:二維數組
主要功能:對輸入數據進行特征提取,卷積操作實質上是把卷積核當濾波器在圖像上特征提取。
卷積步驟:
- 卷積窗口從輸入數組的最左上方,從左往右、從上到下,依次在輸入數組上滑動。
- 窗口中的輸入子數組與卷積核按元素相乘并求和,得到輸出數組中相應位置的元素。
池化層
基本操作:縮小圖片,保留重要特征。不會裁剪刪除內容。
池化步驟:
- 池化層對輸入數據的局部區域(池化窗口)計算輸出,取最大值或平均值,最終降低特征圖的尺寸。
最大池化Max Pooling
取局部區域的最大值
作用:保留最明顯的特征(邊緣、紋理)
平均池化Avg Pooling
取局部區域的平均值
作用:反映特征的整體分布情況。
池化核大小Kernel_size
定義池化窗口的大小
步長stride
控制窗口移動的步長(默認等于池化核大小)
填充padding
在輸入特征圖的邊緣補零:
保持輸出大小不變(如 padding=1 可以保持尺寸)。
防止邊緣信息丟失
激活函數(非線性函數)
(1)sigmoid函數
輸出范圍(0,1),適用于輸出概率。sigmoid函數清晰地解釋神經元激活水平:接近1,更高激活;接近0,較低激活。
應用場景:二分類問題
(2)ReLU激活函數
如果輸入x是 正數,ReLU 輸出 x本身。
如果輸入x是 負數,ReLU 輸出 0。
作用:
- 激活函數的作用是讓網絡學習非線性的特征
- 解決梯度消失問題:Sigmoid 和 Tanh 函數,輸入值變的特別大或特別小時,激活函數的梯度接近0.
缺點:
死神經元問題:某些神經元輸出 永遠是 0 時(也就是當輸入總是負數時)。這會導致這些神經元在訓練過程中不再被更新
(3)tanh函數
?
?輸出范圍:(-1,1)