program里面定义的data长这样:image_lod = fluid.layers.data(name = 'image_lod', dtype = 'float32', shape = [1], lod_level = 1) label_lod = fluid.layers.data(name = 'label_lod', dtype = 'int64', shape = [1], lod_level = 1) last_label_lod = fluid.layers.data(name = 'last_label_lod', dtype = 'int64', shape = [1], lod_level = 1)
都是长度为50的list。
我需要在训练的时候分步处理每一个时间步的数据,了解到有种方法是用lod tensor array。先将lod tensor转换成lod tensor array,然后用while_op和array_read来遍历。但是了解到lod_tensor_to_array只在dynamicRNN里面用到,Python接口并没有对用户暴露,不太了解array = lod_tensor_to_array(x, table)
里面rank_table是什么东西。
有没有遍历序列数据的什么实现方法?或者能解释一下lod_tensor_to_array的用法么?
5条答案
按热度按时间kcugc4gi1#
输入数据使用LODTensor的话,对于分步处理每一个时间步的数据的需求,大部分情况应该都可以直接使用DynamicRNN,可以尝试使用下,这里有示例 https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/tests/book/test_machine_translation.py#L69 ,其中
rnn.step_input
即是每一个时间步的数据,rnn.memory
是需要更新的rnn的hidden state,另外还有个rnn.static_input
是rnn外部的数据在DynamicRNN内的表示(如encoder的output),可以利用这三种数据完成所需操作,可以试下是否能满足需求rank_table记录了每个sequence的长度,DynamicRNN中调用了
lod_tensor_to_array
在产生array时按照rank_table做了特殊处理(sequence从长到短排序后从前到后进行slice),每个时间步数据的batch size可能会缩小(短的sequence结束时),这是Fluid DynamicRNN的一些特殊之处另外对于非LoDTensor的数据,可以试下使用StaticRNN,用法与上面的类似,这里有个语言模型的例子 https://github.com/PaddlePaddle/models/blob/develop/fluid/PaddleNLP/language_model/lstm/lm_model.py#L261
7jmck4yq2#
我采用了这个方案来搭建网络,但是用dynamic rnn训练的速度十分慢,我的基线模型是rnn,跑一个batch只需要0.12s,但是用dynamic rnn得花2s。请问这个可以优化一下吗。
20jt8wwn3#
好的,我们排期支持下
zdwk9cvp4#
可以提供下更多的描述信息吗,我们定位下性能哪儿出了问题
628mspwn5#
主要是这一段的耗时多