Alexnet論文解讀及代碼實現
本文首發于微信公眾號“計算機視覺cv”
# Title文章標題
ImageNet classification with deep revolutional Neural Networks(也就是經典的Alexnet網絡)
# Summary
1、激活函數
與傳統論文使用的tanh和sigmoid激活函數不同,本論文使用的是非線性函數Relu(Rectified Linear Units)函數。
論文中稱ReLU會使訓練誤差下降的更快。如下圖所示
2、在多GPU中運行
論文中使用了兩塊GTX580訓練,兩個GPU會在特定的層進行通信。雙GPU會使得提高1.7%的top-1和1.2%的top-5準確度。并且會加快訓練速度。
3、局部響應歸一化
4、?重疊池化
在傳統方法中,相鄰池化單元之間互不重疊,但是實驗表示使用帶交疊的Pooling的效果比的傳統要好,在top-1和top-5上分別提高了0.4%和0.3%,在訓練階段有避免過擬合的作用。
5、神經網絡結構
該網絡包含了八層權重:前五個是卷積層,其余三個為全連接層。最后的全連接層的輸出被送到1000維的softmax函數,其產生1000個類的預測。我們的網絡最大化多項邏輯回歸目標,這相當于在預測的分布下最大化訓練樣本中正確標簽對數概率的平均值。第二,第四和第五個卷積層的內核僅與上一層存放在同一GPU上的內核映射相連。第三個卷積層的內核連接到第二層中的所有內核映射。全連接層中的神經元連接到前一層中的所有神經元。響應歸一化層緊接著第一個和第二個卷積層,后面連接響應歸一化層以及第五個卷積層。將ReLU應用于每個卷積層和全連接層的輸出。
6、減少過擬合
減少過擬合有兩種方法:一種是數據增強,一種是Dropout。
①數據增強:對圖片進行水平映射、垂直映射、旋轉等等變換。由于是對圖片進行較小的計算,所以增強后的圖片不用保存到硬盤里。
②Dropout:在訓練期間,只需要消耗1/2的參數。它會以50%的概率將隱含層的神經元輸出置為0。以這種方法被置0的神經元不參與網絡的前饋和反向傳播。因此,每次給網絡提供了輸入后,神經網絡都會采用一個不同的結構,但是這些結構都共享權重。這種技術減少了神經元的復雜適應性,因為神經元無法依賴于其他特定的神經元而存在。因此,它被迫學習更強大更魯棒的功能,使得這些神經元可以與其他神經元的許多不同的隨機子集結合使用。
7、訓練細節
論文中使用隨機梯度下降,權重衰減為0.005,momentum為0.9,batch_size=128。
使用標準差=0.01,均值為0的高斯分布來初始化權重。在第二、四、五還有全連接層使用偏差為1來加速前期的訓練,在其余層使用偏差為0。對每個層使用相同的學習率,learning_rate=0.01,訓練過程進行3次的手動調整。
# Evaluation
去掉任一層都會使得結果降低,說明深度很重要。
沒有使用無監督方法去預訓練數據。對視頻序列效果不明顯,因為時間結構往往在靜態圖像中丟失了。
# Code
import pandas as pd import numpy as np from keras.callbacks import EarlyStopping, ModelCheckpoint from matplotlib import pyplot as plt from skimage.io import imread, imshow from skimage import transform import warnings from tqdm import tqdm from keras.layers import Input, Lambda, Conv2D, MaxPool2D, BatchNormalization, Dense, Flatten, Dropout from keras.models import Model from keras.utils import to_categorical warnings.filterwarnings('ignore') image_path = 'F:\\Keras_cnn\\images\\' #文件路徑這樣寫才正確,剛開始以為是'/'一直顯示找不到該文件 IMG_HEIGHT = 400 IMG_WIDTH = 500 IMG_CHANNELS = 1 ''' 處理label ''' train_csv = pd.read_csv('train.csv') train_label_string = train_csv['species'].values train_id = train_csv['id'].values laber_number_dict = {} train_label_number = [] number = 0 for i in train_label_string: if i in laber_number_dict: train_label_number.append(laber_number_dict[i]) else: laber_number_dict.update({i: number}) train_label_number.append(number) number += 1 id_label_dict = dict(zip(train_id, train_label_number)) test_csv = pd.read_csv('test.csv') test_id = test_csv['id'].values train_data = np.zeros((len(train_id), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8) train_label = np.zeros((len(train_id), 1), dtype=np.uint8) test_data = np.zeros((len(test_id), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8) for n, i in tqdm(enumerate(train_id), total=len(train_data)): image_data = imread(image_path + str(i) + '.jpg') image_data = transform.resize(image_data, (IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS)) train_data[n] = image_data train_label[n] = id_label_dict[i] train_label = to_categorical(train_label, 99) for n, i in tqdm(enumerate(test_id), total=len(test_id)): image_data = imread(image_path + str(i) + '.jpg') image_data = transform.resize(image_data, (IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS)) test_data[n] = image_data random_number = np.random.randint(len(train_id)) show_train_data = train_data[random_number].reshape(IMG_HEIGHT, IMG_WIDTH) imshow(show_train_data) plt.show() ''' 開始搭建 AlexNet ''' inputs = Input((IMG_HEIGHT, IMG_WIDTH, 1)) c1 = Conv2D(48, (11, 11), strides=4, activation='relu', kernel_initializer='uniform', padding='valid')(inputs) c2 = BatchNormalization()(c1) c3 = MaxPool2D((3, 3), strides=2, padding='valid')(c2) c4 = Conv2D(128, (5, 5), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c3) c5 = BatchNormalization()(c4) c6 = MaxPool2D((3, 3), strides=2, padding='valid')(c5) c7 = Conv2D(192, (3, 3), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c6) c8 = Conv2D(192, (3, 3), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c7) c9 = Conv2D(128, (3, 3), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c8) c10 = MaxPool2D((3, 3), strides=2, padding='valid')(c9) c11 = Flatten()(c10) c12 = Dense(256, activation='relu')(c11) # 論文中是2048 c13 = Dropout(0.5)(c12) c14 = Dense(256, activation='relu')(c13) # 論文中是2048 c15 = Dropout(0.5)(c14) outputs = Dense(99, activation='softmax')(c15) # 論文中是1000 model = Model(inputs=[inputs], outputs=[outputs]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.summary() earlystopper = EarlyStopping(patience=5, verbose=1) checkpointer = ModelCheckpoint('model-1.h5', verbose=1, save_best_only=True) model.fit(train_data, train_label, validation_split=0.1, batch_size=256, epochs=256, callbacks=[earlystopper, checkpointer])
機器學習 神經網絡
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。