文章目录
- 思考
- 优化
- 转存信息
- 数据转换
- LSTM
智能车AI电磁部署学习 (一)
思考
AI组本意是通过短前瞻短数据集去长前瞻的打脚值,来使得智能车通过短前瞻获得与长前瞻一致的速度。
相对于短前瞻,长前瞻的信息相对更加丰富、准确,短前瞻甚至会丧失一部分关键信息。经过了解、学习LSTM后,并与队友讨论,认为输入不仅要只有电感值,可以尝试输入一些前次或前前次的舵机打脚值与某些主要电感数值,来使得系统更加稳定,且与时间有关,前后联系更加紧密。因为电磁变化是个连续过程,相邻两次的数值是有关联的,而此关联与转角值恰好是有某种非线性函数关系。
优化
数据都是单片机采集存储的,需要把数据整理、发送到PC端并转换成一个训练集、测试集。这里假定智能车采用无线透传串口模块或是SD卡FatFS文件系统存储采集数据。
本着在家要摸鱼的原则,优化了这一流程,更加方便实现训练流程,减少时间开销,编写了一个txt转py数组,且随机打乱自动分配训练、测试集的脚本。
可以读取相应格式的txt文本,转换成对应X
Y
矩阵,自定义设置训练集比例,可直接传入神经网络。
转存信息
首先规定通信格式。
在检测到begin
关键字后开始进行数据转换,一行数据的前N-1项是神经网络的输入,最后的一个参数为训练的结果值,例如100,100,0
,其中100
100
为2输入神经网络的X
值,0
为Y
值(这里我用的是Softmax分类,通过数字转换成独热码,真正的多输出还需改写脚本,舵机打脚值一个数据位即可)。
数据转换
通过读取txt内的数据并将其转换为train_x
,train_y
,test_x
,test_y
,四个矩阵。
train_x_org, train_y_org = readtxt_make_arr("usart.txt", "begin")
train_x_y_org = np.c_[train_x_org, train_y_org] # 合并矩阵 为了保证打乱顺序后其x y值仍然相互对应
train_x_y, test_x_y = split_train(train_x_y_org, 0.2)
train_x, train_y = np.split(train_x_y, [-1], axis=1) # 分割数组最后一列做为y
test_x, test_y = np.split(test_x_y, [-1], axis=1)
np.split(train_x_y, [-1], axis=1) # axis = 1对列操作
读取后,可以看到x_org
与y_org
的大小与输入一致。
打乱并且分割后,训练集与测试集数量相加与源矩阵维度相同,分割比例为0.2,数量正确。
LSTM
LSTM是长短期记忆(Long short-term memory, LSTM),作为一种特殊的RNN相比普通的RNN,LSTM能够在更长的序列中有更好的表现。而电磁数据恰好是一个较长的连续序列。
相对于普通的ANN网络,RNN中的LSTM的前向传播看起来还是略显复杂。
LSTM中遗忘门与更新门是保存记忆与更新记忆的关键,当神经网络可以判断出智能车处于转弯处或是长直道且保存记忆,并在离开元素后更新记忆,效果应该是较为理想的。
但良好的记忆能力使得其非常擅长于长时间记忆某个值,对于存在记忆细胞中的某个值,即使经过很长很长的时间步——吴恩达。
在所剩无几的假期中我并没有打算着手去实现LSTM流程,但其思想可少许借鉴于现有ANN网络的改进,也就是文章开头所说的思考。即使用前次电感值、新电感值、上次打脚值作为神经网络输入,计算出新打脚值。
当回校后若普通ANN效果不尽人意,再考虑是否尝试LSTM的实现。
我认为LSTM可能是电磁传感器控制一种较为合理的方案,智能车AI电磁部署学习 (一)开头的知乎链接中的前辈也提到LSTM(若日后摄像头也可以跑神经网络,那可能一定是采用CNN,或者CNN+RNN的方案) 。
欢迎读者评论、留言、私信共同探讨。