Tensorflow:联合培训CNN + LSTM

时间:2017-02-01 05:33:18

标签: tensorflow deep-learning convolution lstm recurrent-neural-network

关于如何在TF中单独使用LSTM有很多例子,但我找不到任何关于如何联合训练CNN + LSTM的好例子。 从我看来,如何进行此类培训并不是一件容易的事,我可以在这里考虑几个选项:

  • 首先,我认为最简单的解决方案(或最原始的解决方案)是独立训练CNN以学习功能,然后在不更新CNN部分的情况下训练CNN功能上的LSTM,因为人们可能必须提取并保存这些numpy中的功能然后将它们馈送到TF中的LSTM。但在这种情况下,人们可能不得不使用不同标记的数据集来预训练CNN,这消除了端到端训练的优势,即学习LSTM所针对的最终目标的特征(除了必须拥有这些首先是附加标签)。
  • 第二个选项是连接批处理中的所有时间片 维度(4-D Tensor),将其提供给CNN,然后以某种方式重新打包 5-d张量的特征再次需要用于训练LSTM,然后应用成本函数。我主要担心的是,是否可以做这样的事情。此外,处理可变长度序列变得有点棘手。例如,在预测场景中,您当时只会提供单帧。因此,如果这是进行联合培训的正确方法,我会很高兴看到一些例子。除此之外,这个解决方案看起来更像是一个黑客,因此,如果有更好的方法,那么如果有人可以分享它会很棒。

提前谢谢!

1 个答案:

答案 0 :(得分:2)

对于联合培训,您可以考虑使用文档pipe()中所述的tf.map_fn。

让我们假设CNN是按照此处https://www.tensorflow.org/api_docs/python/tf/map_fn所述的类似线路构建的。

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可以分配的模型,您可能需要按照https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10.py中所述查看设备放置。

替代方案是展平视频批处理以创建图像批处理,从CNN执行正向传递并重塑LSTM的功能。