首先貼出三個鏈接:
2. 使用pytorch搭建AlexNet並針對花分類數據集進行訓練
3. 使用tensorflow搭建AlexNet並針對花分類數據集進行訓練
AlexNet是2012年ILSVRC 2012(ImageNet Large Scale Visual Recognition Challenge)競賽的冠軍網絡,分類準確率由傳統方法的 70%+提升到 80%+(當時傳統方法已經進入瓶頸期,所以這麼大的提升是非常厲害的)。它是由Hinton和他的學生Alex Krizhevsky設計的。也是在那年之後,深度學習開始迅速發展。下圖是從AlexNet原論文中截取的網絡結構圖。
在圖中有上下兩個部分是因爲作者使用兩塊GPU進行並行訓練,所以上下兩個部分結構是一模一樣的,我們直接看下面部分就行了。接下來說說該網絡的亮點:
(1)首次利用 GPU 進行網絡加速訓練。
(2)使用了 ReLU 激活函數,而不是傳統的 Sigmoid 激活函數以及 Tanh 激活函數。
(3)使用了 LRN 局部響應歸一化。
(4)在全連接層的前兩層中使用了 Dropout方法按一定比例隨機失活神經元,以減少過擬合。
接着給出經卷積或池化後的矩陣尺寸大小計算公式:
N = (W − F + 2P ) / S + 1
其中W是輸入圖片大小,F是卷積核或池化核的大小, P是padding的像素個數 ,S是步距
接下來我們對網絡的每一層進行詳細的分析:
卷積層1(由於使用了2塊GPU,所以卷積核的個數需要乘以2):
Conv1: kernels:48*2=96;kernel_size:11;padding:[1, 2] ;stride:4
其中kernels代表卷積核的個數,kernel_size代表卷積的尺寸,padding代表特徵矩陣上下左右補零的參數,stride代表步距
輸入的圖像shape: [224, 224, 3], 輸出特徵矩陣的shape: [55, 55, 96]
shape計算:N = (W − F + 2P ) / S + 1 = [ 224 - 11 + (1 + 2)] / 4 + 1 = 55
最大池化下采樣層1
Maxpool1: kernel_size:3;pading: 0;stride:2
其中kernel_size是池化核大小,padding代表特徵矩陣上下左右補零的參數,stride代表步距
輸入特徵矩陣的shape: [55, 55, 96], 輸出特徵矩陣的shape: [27, 27, 96]
shape計算:N = (W − F + 2P ) / S + 1 = (55 - 3) / 2 + 1 = 27
卷積層2
Conv2: kernels:128*2=256; kernel_size:5; padding: [2, 2]; stride:1
輸入特徵矩陣的shape:[27, 27, 96], 輸出特徵矩陣的shape: [27, 27, 256]
shape計算:N = (W − F + 2P ) / S + 1 = (27 - 5 + 4) / 1 + 1 = 27
最大池化下采樣層2
Maxpool2: kernel_size:3; pading: 0; stride:2
輸入特徵矩陣的shape: [27, 27, 256],輸出特徵矩陣的shape: [13, 13, 256]
shape計算:N = (W − F + 2P ) / S + 1 = (27 - 3) / 2 + 1 = 13
卷積層3
Conv3: kernels:192*2=384; kernel_size:3; padding: [1, 1]; stride:1
輸入特徵矩陣shape:[13, 13, 256], 輸出特徵矩陣shape: [13, 13, 384]
shape計算:N = (W − F + 2P ) / S + 1 = (13 - 3 + 2) / 1 + 1 = 13
卷積層4
Conv4: kernels:192*2=384; kernel_size:3; padding: [1, 1]; stride:1
輸入特徵矩陣shape:[13, 13, 384], 輸出特徵矩陣shape: [13, 13, 384]
shape計算:N = (W − F + 2P ) / S + 1 = (13 - 3 + 2) / 1 + 1 = 13
卷積層5
Conv5: kernels:128*2=256; kernel_size:3; padding: [1, 1]; stride:1
輸入特徵矩陣shape:[13, 13, 384],輸出特徵矩陣shape: [13, 13, 256]
shape計算:N = (W − F + 2P ) / S + 1 = (13 - 3 + 2) / 1 + 1 = 13
最大池化下采樣層3
Maxpool3: kernel_size:3 padding: 0 stride:2
輸入特徵矩陣shape:[13, 13, 256] ,輸出特徵矩陣shape: [6, 6, 256]
shape計算:N = (W − F + 2P ) / S + 1 = (13 - 3) / 2 + 1 = 6
全連接層1
unit_size: 2048 (unit_size爲全連接層節點個數)
全連接層2
unit_size: 2048
全連接層3
unit_size: 1000(該層爲輸出層,輸出節點個數對應你分類任務的類別個數)
最後給出所有層參數的總表:
layer_name |
kernel_size |
kernel_num |
padding |
stride |
Conv1 |
11 |
96 |
[1, 2] |
4 |
Maxpool1 |
3 |
None |
0 |
2 |
Conv2 |
5 |
256 |
[2, 2] |
1 |
Maxpool2 |
3 |
None |
0 |
2 |
Conv3 |
3 |
384 |
[1, 1] |
1 |
Conv4 |
3 |
384 |
[1, 1] |
1 |
Conv5 |
3 |
256 |
[1, 1] |
1 |
Maxpool3 |
3 |
None |
0 |
2 |
FC1 |
2048 |
None |
None |
None |
FC2 |
2048 |
None |
None |
None |
FC3 |
1000 |
None |
None |
None |
關於模型的搭建與訓練代碼放在我的github中,大家可自行下載使用:
https://github.com/WZMIAOMIAO/deep-learning-for-image-processing
pytorch版本在pytorch_learning文件夾中,tensorflow版本在tensorflow_learning文件夾中.