Tensorflow:联合训练CNN + LSTM

fs8*_*s86 5 convolution deep-learning lstm tensorflow recurrent-neural-network

关于如何在 TF 中单独使用 LSTM 的例子有很多,但我找不到任何关于如何联合训练 CNN + LSTM 的好例子。就我所见,如何进行此类培训并不是很简单,我可以在这里想到一些选择:

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

先感谢您 !

use*_*996 2

对于联合训练,您可以考虑使用 tf.map_fn,如文档https://www.tensorflow.org/api_docs/python/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
Run Code Online (Sandbox Code Playgroud)

警告:如果您的模型大于 GPU 可以分配的内存,您可能需要按照此处所述查看设备布局https://www.tensorflow.org/tutorials/using_gpu 。

另一种选择是展平视频批次以创建图像批次,从 CNN 进行前向传播并重塑 LSTM 的特征。