关于如何在TF中单独使用LSTM有很多例子,但我找不到任何关于如何联合训练CNN LSTM的好例子.
从我看到的情况来看,如何进行此类培训并不是很简单,我可以在这里考虑几个选项:
>首先,我认为最简单的解决方案(或最原始的解决方案)是独立训练CNN以学习功能,然后在不更新CNN部分的情况下训练CNN功能上的LSTM,因为人们可能必须提取并保存这些功能. numpy然后将它们送到TF中的LSTM.但在这种情况下,人们可能不得不使用不同标记的数据集来预训练CNN,这消除了端到端训练的优势,即学习LSTM所针对的最终目标的特征(除了必须拥有这些首先是附加标签).
>第二个选项是连接批处理中的所有时间片
维度(4-D Tensor),将其提供给CNN,然后以某种方式重新打包
5-d张量的特征再次需要用于训练LSTM,然后应用成本函数.我主要担心的是,是否可以做这样的事情.此外,处理可变长度序列变得有点棘手.例如,在预测场景中,您当时只会提供单帧.因此,如果这是进行联合培训的正确方法,我会很高兴看到一些例子.除此之外,这个解决方案看起来更像是一个黑客,因此,如果有更好的方法,那么如果有人可以共享它会很棒.
先感谢您 !
最佳答案 对于联合培训,您可以考虑使用文档
https://www.tensorflow.org/api_docs/python/tf/map_fn中所述的tf.map_fn.
让我们假设CNN是按照https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10.py所述的类似线路构建的.
def joint_inference(sequence):
inference_fn = lambda image: inference(image)
logit_sequence = tf.map_fn(inference_fn, sequence, dtype=tf.float32, swap_memory=True)
lstm_cell = tf.contrib.rnn.LSTMCell(128)
output_state, intermediate_state = tf.nn.dynamic_rnn(cell=lstm_cell, inputs=logit_sequence)
projection_function = lambda state: tf.contrib.layers.linear(state, num_outputs=num_classes, activation_fn=tf.nn.sigmoid)
projection_logits = tf.map_fn(projection_function, output_state)
return projection_logits
警告:如果您的模型大于gpu可以分配的内存,您可能必须按照此处所述查看设备放置.
另一种方法是展平视频批处理以创建图像批处理,从CNN执行正向传递并重新整形LSTM的功能.