资讯专栏INFORMATION COLUMN

GTAV智能驾驶源码详解(二)——Train the AlexNet

jayzou / 1480人阅读

摘要:智能驾驶源码详解二模型简介本使用进行图像分类前进左转右转。其性能超群,在年图像识别比赛上展露头角,是当时的冠军,由团队开发,领头人物为教父。

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都更新一次参数。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44463.html

相关文章

  • GTAV智能驾驶源码详解(一)——制作数据集

    摘要:本暂且称之为借鉴了美国死宅的方案,只使用截图捕捉的画面以模拟摄像头数据作为的输入,并没有真实的智能驾驶所涉及的传感器与雷达数据。在游戏中人为驾驶小时,将每一帧图片以及其所对应的操作向量记录在数据集张量中。每帧保存一次数据集设置为暂停键。 项目介绍 场景足够丰富,操作足够简单,有大量的交通工具和驾驶视角可供选择,游戏《Grand Theft Auto 5》是一个相对廉价且适合初级人工智能...

    lookSomeone 评论0 收藏0
  • 从DensNet到CliqueNet,解读北大在卷积架构上的探索

    摘要:首先第一种当然是在年提出的,它奠定了整个卷积神经网络的基础。其中局部感受野表示卷积核只关注图像的局部特征,而权重共享表示一个卷积核在整张图像上都使用相同的权值,最后的子采样即我们常用的池化操作,它可以精炼抽取的特征。 近日,微软亚洲研究院主办了一场关于 CVPR 2018 中国论文分享会,机器之心在分享会中发现了一篇非常有意思的论文,它介绍了一种新型卷积网络架构,并且相比于 DenseNet...

    Jackwoo 评论0 收藏0
  • 计算机如何高效识别图像?

    摘要:机器学习专家智能机器如何思考作者如是说。此神经网络可以用一个神经元来完成这项任务。与此同时,整个网络个神经元共有个偏置。它将降低和神经元除了神经元的输入方的权重,使输出神经元的值降低。令下次遇到这个图像时,此神经元会产生更大的输出值。 原文 How computers got shockingly good at recognizing images作者 Timothy B. Lee译...

    Cobub 评论0 收藏0
  • 计算机如何高效识别图像?

    摘要:机器学习专家智能机器如何思考作者如是说。此神经网络可以用一个神经元来完成这项任务。与此同时,整个网络个神经元共有个偏置。它将降低和神经元除了神经元的输入方的权重,使输出神经元的值降低。令下次遇到这个图像时,此神经元会产生更大的输出值。 原文 How computers got shockingly good at recognizing images作者 Timothy B. Lee译...

    nanchen2251 评论0 收藏0
  • 计算机如何高效识别图像?

    摘要:机器学习专家智能机器如何思考作者如是说。此神经网络可以用一个神经元来完成这项任务。与此同时,整个网络个神经元共有个偏置。它将降低和神经元除了神经元的输入方的权重,使输出神经元的值降低。令下次遇到这个图像时,此神经元会产生更大的输出值。 原文 How computers got shockingly good at recognizing images作者 Timothy B. Lee译...

    ISherry 评论0 收藏0

发表评论

0条评论

jayzou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<