解释:将上一时刻的hidden state和memory拆开,用于计算后,所出现的新的当前时刻的hidden state和memory会再次并在一起作为该function的返回值,同样是为了满足scan的特点。定义该function后,LSTM就已经完成了。one_step方法会使用LSTM类中所定义的parameters与当前时刻的输入和上一时刻的hidden state与memory cell计算当前时刻的hidden state和memory cell。 scan:使用scan逐次迭代计算所有timesteps,最后得出所有的hidden states进行后续的处理。 代码: 解释:scan接受的fn, elems, initializer有以下要求: fn:第一个输入是上一时刻的输出(需要与fn的返回值保持一致),第二个输入是当前时刻的输入。 elems:scan方法每一步都会沿着所要处理的tensor的第一个维进行一次一次取值,所以要将数据由[n_samples, n_steps, D_cell]的形状变成[n_steps, n_samples, D_cell]的形状。 initializer:初始值,需要与fn的第一个输入和返回值保持一致。 scan的返回值在上例中是[n_steps, 2, n_samples, D_cell],其中第二个维度的2是由hidden state和memory cell组成的。 构建网络代码: 解释:以hard coding的方式直接构建一个网络,输入是39维,第一个隐藏层也就是RNN-LSTM,1024维,而输出层又将1024维的LSTM的输出变换到24维与label对应。 注: 这个网络并不仅仅取序列的最后一个值,而是要用所有timestep的值与实际轨迹进行比较计算loss 训练网络 代码: 解释:由于上文的LSTM是非常直接的编写方式,并不高效,在实际使用中会花费较长时间。 预测效果代码: 解释:plot出一个样本中的维度的预测效果与真是轨迹进行对比 效果图: 总结说明 该文是尽可能只展示LSTM最核心的部分(只训练了10次,有兴趣的朋友可以自己多训练几次),帮助大家理解其工作方式而已,直播,完整代码可以从我的github中LSTM_lV1中找到。 该LSTM由于运行效率并不高,下一篇会稍微进行改动加快运行速度,并整理结构方便使用GRU以及多层RNN的堆叠以及双向RNN,同时加入其他功能。 GitHub资源:https://github.com/YJango/tensorflow/blob/master/RNN/LSTM_scan_LV1.ipynb 热门文章推荐
(责任编辑:本港台直播) |