最近需要在模拟器中搜集自动驾驶的数据(图片和车速),开始使用模拟器手动控制车俩的程序时很恼火,很不容易控制。于是我自己写了一份手动控制代码,方便操控。正是这份控制起来方便的方案坑了我很久,自己挖的坑还得自己爬。下面对这坑进行总结一下。
挖坑过程详解:
学习自动驾驶的同学可能都使用过模拟器,使用模拟器搜集数据集时都会手动控制车俩行驶。简单道路还好,道路弯多一点很容易就跑出去了(条件有限,只能键盘控制),强迫症的我不断重新开始,速度快一点就跑出去了,太慢又受不了(速度和方向都很敏感,模拟的真实车俩)。突然我灵机一动何不自己写一个,速度和方向好控制的方案。下面给出控制策略的代码:
if key == 'w':
speed += 1.
if speed >= 40:
speed = 40
elif key == 's':
speed -= 1.
if speed <= -10:
speed = -10
elif key == 'a':
angle += 1.
if angle >= 15:
angle = 15
elif key == 'd':
angle -= 1.
if angle <= -15:
angle = -15
哈哈哈,就是这么简单!这样在跑弯道时我可以把角度和速度保持在某个位置。测试果然效果不错。就这样我收集了我需要的数据,然后训练网络,最后在模拟器中测试,看上去感觉也还可以。那么问题是什么了?这样的模型鲁棒性非常的差,稍微调整一下车辆的方向位置,或者改变一下环境,效果就非常差。不管我如何修改网络,鲁棒性并没有多少提高。下面我们分析一下问题出在哪儿了?
分析问题:
我们先理解一下DNN模型的本质是什么?我的理解是一种映射关系,这里就是图片与角度、速度的一种映射。我们训练的过程就是寻找这种映射的对应关系。那么上面的问题怎么解释了?由于上面的代码,车俩在某个位置时,我习惯性的做出相同的操作,因为我知道这样可以让车辆更快的通过。这就导致了同一位置的数据相似性很高,也就是定义域和值域比较窄。训练的数据集都很窄,映射出来的关系也可想而知。本质上这个坑很蠢,作为小白爬这样的坑也很正常。
总结问题:
1、不要嫌麻烦,走捷径,人生没有捷径可走;
2、DNN虽然能对高维数据进行一种映射,但终究是没有真正意义上的决策能力;
3、端到端的解决方案任重而道远,寄希望与强化学习。
注:以上为现阶段学习的总结,也许明天观点就变了