AlexNet網絡共8層,5層卷積層,3層全連接。
1. C1卷積層:卷積-ReLU-pool-BN
(1)卷積
輸入大小:227*227*3
卷積核大小:11*11*3
卷積核數量:96
padding:0
卷積後輸出大小:55*55*48*2 #(227-11)/4+1
(2)非線性變換
(3)池化
輸入大小:55*55*48*2
卷積核大小:3*3
stride步長:2
輸出大小:27*27*48*2 #(55-3)/2+1=27
(4)BN局部歸一化:使用k=2,n=5,α=10−4,β=0.75進行局部歸一化,輸出分爲兩組,每組的大小爲27×27×48
2. C2卷積層:卷積-ReLU-pool-BN
(1)卷積(兩組27×27×48)
輸入大小:27×27×48*2
卷積核大小:5*5*48*2
卷積核數量:128
padding:2
stride步長:1
卷積後輸出大小:27*27*128*2 #(27-5+2*2)/1+1
(2)非線性變換
(3)池化
輸入大小:27*27*128*2
卷積核大小:3*3
stride步長:2
輸出大小:13*13*128*2 #(27-3)/2+1=13
(4)BN局部歸一化:使用k=2,n=5,α=10−4,β=0.75進行局部歸一化,輸出分爲兩組,每組的大小爲13*13*128
3. C3卷積層:卷積-ReLU
(1)卷積(兩組13*13*128)
輸入大小:13*13*128*2
卷積核大小:3×3×128*2
卷積核數量:192
padding:1
stride步長:1
卷積後輸出大小:13*13*192*2 #(13-3+2*1)/1+1
(2)非線性變換
4. C4卷積層:卷積-ReLU
(1)卷積(兩組13*13*192*2)
輸入大小:13*13*192*2
卷積核大小:3×3×192*2
卷積核數量:192
padding:1
stride步長:1
卷積後輸出大小:13*13*192*2 #(13-3+2*1)/1+1
(2)非線性變換
5. C5卷積層:卷積-ReLU
(1)卷積(13*13*192*2)
輸入大小:13*13*192*2
卷積核大小:3×3×192
卷積核數量:128
padding:1
stride步長:1
卷積後輸出大小:13*13*128*2 #(13-3+2*1)/1+1
(2)非線性變換
(3)池化:
輸入大小:13*13*128*2
卷積核大小:3*3
stride步長:2
輸出大小:6*6*128*2 #(13-3)/2+1=13
6. FC6:(卷積)全連接 -ReLU -Dropout
輸入大小:6*6*128*2
卷積核大小:6*6*2*128
卷積核數量:4096
輸出大小:4096*1
7. FC7:(卷積)全連接 -ReLU -Dropout
輸入大小:6*6*128*2
輸出大小:4096*1
8. 輸出層:
輸入大小:6*6*128*2
輸出大小:4096*1
import torch
import torch.nn as nn
class AlexNet(nn.Module):
def __init__(self, num_class):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 96, kernel_size=11, stride=4),
nn.ReLU(inplace=True),
nn.MaxPool2d(3, 2),
nn.Conv2d(96, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(3, 2),
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),# inplace-選擇是否進行覆蓋運算
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),# inplace-選擇是否進行覆蓋運算
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),# inplace-選擇是否進行覆蓋運算
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256*6*6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_class)
)
def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), 256*6*6)
x = self.classifier(x)
return x
model = AlexNet(1000)
print(model)