LeNet5
論文原文:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf
LeNet-5 網(wǎng)絡(luò)結(jié)構(gòu)
該篇論文有 42 頁,但關(guān)于 LeNet-5 網(wǎng)絡(luò)的核心部分并沒有那么多粟誓,我們直接定位第二章的B 小節(jié)進(jìn)行閱讀起意。LeNet-5 的網(wǎng)絡(luò)結(jié)構(gòu)如下:
LeNet-5 共有 7 層,輸入層不計(jì)入層數(shù)揽咕,每層都有一定的訓(xùn)練參數(shù),其中三個(gè)卷積層的訓(xùn)練參數(shù)較多设易,每層都有多個(gè)濾波器蛹头,也叫特征圖,每個(gè)濾波器都對(duì)上一層的輸出提取不同的像素特征渣蜗。所以 LeNet-5 的簡(jiǎn)略結(jié)構(gòu)如下:
輸入-卷積-池化-卷積-池化-卷積(全連接)-全連接-全連接(輸出)
各層的結(jié)構(gòu)和參數(shù)如下:
C1層是個(gè)卷積層,其輸入輸出結(jié)構(gòu)如下:
輸入: 32 x 32 x 1 濾波器大兴侠ァ: 5 x 5 x 1 濾波器個(gè)數(shù):6
輸出: 28 x 28 x 6
參數(shù)個(gè)數(shù): 5 x 5 x 1 x 6 + 6 = 156
P2層是個(gè)池化層骚烧,其輸入輸出結(jié)構(gòu)如下:
輸入: 28 x 28 x 6 濾波器大邢臃汀: 2 x 2 濾波器個(gè)數(shù):6
輸出: 14 x 14 x 6
參數(shù)個(gè)數(shù):2 x 6 = 12
在原文中掺炭,P1池化層采用的是平均池化凭戴,鑒于現(xiàn)在普遍都使用最大池化,所以在后面的代碼實(shí)現(xiàn)中我們統(tǒng)一采用最大池化么夫。
C3層是個(gè)卷積層,其輸入輸出結(jié)構(gòu)如下:
輸入: 14 x 14 x 6 濾波器大猩娣恪: 5 x 5 x 6 濾波器個(gè)數(shù):16
輸出: 10 x 10 x 16
參數(shù)個(gè)數(shù): 5 x 5 x 6 x 16 + 16 = 2416
P2 池化之后的特征圖組合計(jì)算得到C3的濾波器個(gè)數(shù)腐螟。
P4層是個(gè)池化層,其輸入輸出結(jié)構(gòu)如下:
輸入: 10 x 10 x 16 濾波器大谐耐ⅰ: 2 x 2 濾波器個(gè)數(shù):16
輸出: 5 x 5 x 16
參數(shù)個(gè)數(shù): 2 x 16 = 32
C5層在論文中是個(gè)卷積層汽绢,但濾波器大小為 5 x 5,所以其本質(zhì)上也是個(gè)全連接層宁昭。如果將5 x 5 x 16 拉成一個(gè)向量,它就是一個(gè)全連接層疆拘。其輸入輸出結(jié)構(gòu)如下:
輸入: 5 x 5 x 16 濾波器大屑挪堋: 5 x 5 x 16 濾波器個(gè)數(shù):120
輸出: 1 x 1 x 120
參數(shù)個(gè)數(shù): 5 x 5 x 16 x 120 + 120 = 48120
F6層是個(gè)全連接層,全連接的激活函數(shù)采用的是函數(shù)稀颁,其輸入輸出結(jié)構(gòu)如下:
輸入:120
輸出:84
參數(shù)個(gè)數(shù):120 x 84 + 84 = 10164
F7層即輸出層,也是個(gè)全連接層棱烂,其輸入輸出結(jié)構(gòu)如下:
輸入:84
輸出:10
參數(shù)個(gè)數(shù): 84 x 10 + 10 = 850
code:
class LeNet(nn.Module):
"""use myself network.
inputs img size is 32 * 32
Args:
num_classes: img classes.
"""
def __init__(self, num_classes=NUM_CLASSES):
super(LeNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 6, kernel_size=5, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5, stride=1, padding=0),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(5 * 5 * 16, 120),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(120, 84),
nn.ReLU(inplace=True),
nn.Linear(84, num_classes)
)
def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), -1)
out = self.classifier(x)
return out