AlexNet详述
簡介
總的來說,目前處在深度學習第三次高潮時期,一般認為這個時期的開端是Hinton于2006年在Science上發表文章:一種稱為“深度置信網絡(deep belief network)”的神經網絡模型可以通過逐層預訓練的方式,有效完成模型訓練過程。這就是“深度學習”這一名詞的來由。
不過,這篇文章的發表遠沒有今天形容的這么偉大,甚至,在當時的學術界,并沒有引起太大的波瀾。真正讓深度學習以及深度神經網絡從“象牙塔中的研究”走到實際工業應用領域的是卷積神經網絡在2012年計算機視覺的“圣杯”ImageNet競賽上強勢奪冠,超越第二名10.9個百分點。這場比賽讓卷積神經網絡乃至深度神經網絡真正走到了世界學術的舞臺上。
本項目使用Keras復現AlexNet并在數據集上進行效果測試。
-
論文標題
ImageNet Classification with Deep Convolutional Neural Networks
-
論文地址
https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
-
論文源碼
https://github.com/pytorch/vision/blob/master/torchvision/models/alexnet.py(PyTorch實現)
網絡說明
結構說明
該結構分為上下兩個部分,每部分含有五層卷積層和三層全連接層,之所以分為兩部分是為了方便在兩片GPU上進行訓練,只在第三層卷積層和全連接層處上下兩部分可以交互。由于上下兩部分完全一致,分析時一般取一部分即可。
在該圖中,大體的網絡配置已經非常清晰,激活函數全部使用了Relu函數并使用了LRN進行參數規范化。
主要貢獻
盡管這個結構在今天看來非常基礎,但正是這樣的結構為后面諸多復雜卷積神經網絡提供了基礎,在卷積神經網絡的發展進程中占據里程碑式的地位。其主要的幾個貢獻如下。
代碼實現
最新版本的Keras等框架已經不再提供LRN了,后面VGGNet等證明LRN并沒有想象中那么好的效果,現在流行的規范化選擇是BN,所以實現時使用BN層進行規范化。
由于AlexNet的局限性(參數不少、效果不比后來的很多卷積神經網絡),現今的主流框架很多已經不再封裝AlexNet了。下面主要實現AlexNet基本結構,去除LRN規范化。
def AlexNet(input_shape=(224, 224, 3), n_classes=1000):""":param input_shape::param n_classes::return:"""# inputinput_tensor = Input(shape=input_shape)# conv1x = Conv2D(96, (11, 11), strides=(4, 4), padding='valid', activation='relu')(input_tensor)# x = BatchNormalization()(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='valid')(x)# conv2x = Conv2D(256, (5, 5), strides=1, padding='same', activation='relu')(x)# x = BatchNormalization()(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='valid')(x)# conv3x = Conv2D(384, (3, 3), strides=1, padding='same', activation='relu')(x)x = Conv2D(384, (3, 3), strides=1, padding='same', activation='relu')(x)x = Conv2D(256, (3, 3), strides=1, padding='same', activation='relu')(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='valid')(x)# fcx = Flatten()(x)x = Dense(4096, activation='relu')(x)x = Dropout(0.5)(x)x = Dense(4096, activation='relu')(x)x = Dropout(0.5)(x)x = Dense(n_classes, activation='softmax')(x)model = Model(input_tensor, x)return model模型訓練
數據集使用Caltech101數據集,比較性能,不進行數據增廣(注意刪除干擾項)。Batch大小定為32。損失函數使用經典分類的交叉熵損失函數,優化函數使用Adam,激活函數使用Relu。(這都是比較流行的選擇)
訓練結果
具體訓練結果見文末Github的notebook文件。
可以看到,由于數據集小的限制,模型很快就陷入了過擬合,但是能夠過擬合訓練集已經證明了模型表示學習的能力。
補充說明
盡管今天看來,AlexNet已經不太實用,但是當時的很多思路影響了后來很多卷積神經網絡的設計思路,如使用Relu作為激活函數、輸出標準化。使用dropout防止過擬合。本項目源碼上傳至我的Github,歡迎Star或者Fork。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
- 上一篇: ResNet详述
- 下一篇: DenseNet详述