GTAV智能驾驶源码详解(二)——Train the AlexNet
GTAV智能驾驶源码详解(二)——Train the AlexNet
模型简介:
本AI(ScooterV2)使用AlexNet进行图像分类(前进、左转、右转)。
Alexnet是一个经典的卷积神经网络,有5个卷积层,其后为3个全连接层,最后的输出激活函数为分类函数softmax。其性能超群,在2012年ImageNet图像识别比赛上展露头角,是当时的冠军Model,由SuperVision团队开发,领头人物为AI教父Jeff Hinton。
网络结构如图1所示:
图1 AlexNet示意图
定义模型:
#导入依赖库(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注释:
- 模型传入参数为3个:图像的长度、宽度和梯度下降学习率;
- 模型的Input Layer接受数据集中的图片作为输入,图像长度160,高度为90,channel数量为三,输入数据为m*160*90*3的张量,m为一次英处理的样本数量;
- Input Layer后跟着第一个卷积层,卷积核数量为96,卷积核尺寸为11*11,卷积步长为4,该卷积层使用ReLu作为激活函数;
- 第一个卷积层后跟着第一个池化层,池化类型为MaxPooling,池化尺寸3*3,池化步长为2;
- 池化之后的结果通向LRN层,jeff hinton的标注为模拟大脑的侧向抑制,对张量中的每个元素都用它和它相邻feature map的元素的平均值代替(虽然好像并没有什么用),具体原理如图2;
- 之后是AlexNet的第二个卷积层,卷积核数量为256,卷积核尺寸为5*5,卷积步长默认为1,该卷积层依然使用ReLu作为激活函数;
- 之后的池化层依旧为MaxPooling,池化尺寸3*3,池化步长为2;
- 第二个LRN层,作用同上;
- 之后是三个接连的卷积层,卷积核数量依次为384、384、256,卷积核尺寸都为3*3,都用ReLu作为激活函数;
- 经过尺寸为3*3,步长为2的池化层和一个LRN层之后,卷积网络部分结束,通向3个全连接层。前两个全连接层都向后输出长度为4096的向量,使用tanh作为非线性激活函数,都有50%的dropout概率,神经元有二分之一的可能性被deactivate;第三个全连接层为输出层,输出3维向量,并使用softmax作为分类的激活函数。
- 每一次前向传播完成后,使用交叉熵cross_entropy作为卷积网络的loss函数;整个神经网络使用momentum作为优化(梯度下降加上momentum过滤由于lr过高引起的振荡),个人觉得使用Adam也许效果会更好,收敛会更快。
图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都更新一次参数。
相关推荐
liqing 2019-12-20
ysum 2018-05-08
panrenlong 2018-05-08
zhonghua 2017-08-23
Jasonmmt 2018-05-24
ibelieveican0 2018-08-19
lingyu 2017-11-20
loovelj 2018-04-11