GTAV智能駕駛源碼詳解(二)——Train the AlexNet

GTAV智能駕駛源碼詳解(二)——Train the AlexNet

模型簡介:

本AI(ScooterV2)使用AlexNet進行圖像分類(前進、左轉、右轉)。
Alexnet是一個經典的卷積神經網絡,有5個卷積層,其後爲3個全鏈接層,最後的輸出激活函數爲分類函數softmax。其性能超羣,在2012年ImageNet圖像識別比賽上展露頭角,是當時的冠軍Model,由SuperVision團隊開發,領頭人物爲AI教父Jeff Hinton。網絡

網絡結構如圖1所示:dom

clipboard.png
圖1 AlexNet示意圖ide

定義模型:

#導入依賴庫(tflearn backended)
import tflearn
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.estimator import regression
from tflearn.layers.normalization import local_response_normalization
from collections import Counter
from numpy.random import shuffle
import numpy as np
import numpy as np
import pandas as pd

#定義AlexNet模型
def alexnet(width, height, lr):
    network = input_data(shape=[None, width, height, 1], name='input')
    network = conv_2d(network, 96, 11, strides=4, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = conv_2d(network, 256, 5, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = conv_2d(network, 384, 3, activation='relu')
    network = conv_2d(network, 384, 3, activation='relu')
    network = conv_2d(network, 256, 3, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = fully_connected(network, 4096, activation='tanh')
    network = dropout(network, 0.5)
    network = fully_connected(network, 4096, activation='tanh')
    network = dropout(network, 0.5)
    network = fully_connected(network, 3, activation='softmax')
    network = regression(network, 
                         optimizer='momentum',
                         loss='categorical_crossentropy',
                         learning_rate=lr, 
                         name='targets')

    model = tflearn.DNN(network, 
                        checkpoint_path='model_alexnet',
                        max_checkpoints=1, 
                        tensorboard_verbose=2, 
                        tensorboard_dir='log')

    return model

AlexNet註釋:

  1. 模型傳入參數爲3個:圖像的長度、寬度和梯度降低學習率;
  2. 模型的Input Layer接受數據集中的圖片做爲輸入,圖像長度160,高度爲90,channel數量爲三,輸入數據爲m*160*90*3的張量,m爲一次英處理的樣本數量;
  3. Input Layer後跟着第一個卷積層,卷積核數量爲96,卷積核尺寸爲11*11,卷積步長爲4,該卷積層使用ReLu做爲激活函數;
  4. 第一個卷積層後跟着第一個池化層,池化類型爲MaxPooling,池化尺寸3*3,池化步長爲2;
  5. 池化以後的結果通向LRN層,jeff hinton的標註爲模擬大腦的側向抑制,對張量中的每一個元素都用它和它相鄰feature map的元素的平均值代替(雖然好像並無什麼用),具體原理如圖2;
  6. 以後是AlexNet的第二個卷積層,卷積核數量爲256,卷積核尺寸爲5*5,卷積步長默認爲1,該卷積層依然使用ReLu做爲激活函數;
  7. 以後的池化層依舊爲MaxPooling,池化尺寸3*3,池化步長爲2;
  8. 第二個LRN層,做用同上;
  9. 以後是三個接連的卷積層,卷積核數量依次爲38四、38四、256,卷積核尺寸都爲3*3,都用ReLu做爲激活函數;
  10. 通過尺寸爲3*3,步長爲2的池化層和一個LRN層以後,卷積網絡部分結束,通向3個全鏈接層。前兩個全鏈接層都向後輸出長度爲4096的向量,使用tanh做爲非線性激活函數,都有50%的dropout機率,神經元有二分之一的可能性被deactivate;第三個全鏈接層爲輸出層,輸出3維向量,並使用softmax做爲分類的激活函數。
  11. 每一次前向傳播完成後,使用交叉熵cross_entropy做爲卷積網絡的loss函數;整個神經網絡使用momentum做爲優化(梯度降低加上momentum過濾因爲lr太高引發的振盪),我的以爲使用Adam也許效果會更好,收斂會更快。

clipboard.png
圖2 Local_Response_Normolization示意圖函數

卷積網絡的訓練:

WIDTH = 160
HEIGHT = 90
LR = 1e-3
EPOCHS = 10
MODEL_NAME = 'scooterv2.model'
model = alexnet(WIDTH, HEIGHT, LR)

train_data = np.load('training_data_after_shuffle.npy')
train = train_data[:-1000]
test = train_data[-1000:]

X = np.array([i[0] for i in train]).reshape(-1,WIDTH,HEIGHT,1)
Y = [i[1] for i in train]

test_x = np.array([i[0] for i in test]).reshape(-1,WIDTH,HEIGHT,1)
test_y = [i[1] for i in test]

for index in range(1,200):

    
    model.fit({'input': X}, 
              {'targets': Y}, 
              n_epoch=EPOCHS, 
              validation_set=({'input': test_x}, {'targets': test_y}), 
              snapshot_step=500, 
              show_metric=True, 
              run_id=MODEL_NAME)
    model.save(MODEL_NAME)

學習率爲0.001,for循環中每一次迭代訓練的epoch數量爲10,mini_batch的樣本數量使用默認值64;數據集的後1000個做爲validation set,剩餘的都做爲測試集使用。
跑一次一共訓練了200*10=2000次,但實際上參數更新了20萬次,每一次mini_batch都更新一次參數。性能

相關文章
相關標籤/搜索