Tensorflow:联合培训CNN和x2B;LSTM

Tensorflow:联合培训CNN和x2B;LSTM,tensorflow,deep-learning,convolution,lstm,recurrent-neural-network,Tensorflow,Deep Learning,Convolution,Lstm,Recurrent Neural Network,关于如何在TF中单独使用LSTM,有很多例子,但我找不到任何关于如何联合训练CNN+LSTM的好例子。 据我所见,如何进行此类培训并不十分简单,我可以在这里想到几个选项: 首先,我认为最简单的解决方案(或最原始的解决方案)是独立地训练CNN来学习功能,然后在CNN功能上训练LSTM,而不更新CNN部分,因为可能必须在numpy中提取并保存这些功能,然后在TF中将它们提供给LSTM。但在这种情况下,可能必须使用不同标签的数据集进行CNN预培训,这消除了端到端培训的优势,即学习LSTM针对最终目标

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

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

提前谢谢你 让我们假设CNN是按照这里描述的类似线路构建的

警告:如果您的型号大于gpu所能分配的内存,您可能必须查看此处所述的设备位置


另一种方法是展平视频批次以创建图像批次,从CNN向前传递并重塑LSTM的特征。

在第一个示例中,什么是
序列
,什么是
推断
?对于第二种选择,我们不是有一些边界问题吗?
序列
将是视频序列,
推断
是一个为CNN进行转发的函数。你能详细说明一下边界问题吗?关于边界,我的意思是,在最初的情况下,我们在边界上有零填充,当我们对图像进行压缩时,我们会在较小的图像之间的大图像上有边缘,也许这不是一个问题,但肯定是一个区别。
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