2

TFでLSTMを単独で使用する方法の例がたくさんありますが、CNN + LSTMを共同でトレーニングする良い例は見つかりませんでした。 このような訓練を行う方法は非常に簡単ではない、と私はここにいくつかのオプションを考えることができ、私が見たものから:Tensorflow:共同トレーニングCNN + LSTM

  • まず、私は最も簡単な解決策(または最も原始的なもの)になると信じてこれらの機能をnumpyで抽出して保存してから、TFのLSTMにフィードする必要があるため、CNNを個別にトレーニングし、CNNの部分を更新することなくLSTMをCNNの機能にトレーニングする必要があります。しかし、このシナリオでは、エンドツーエンドのトレーニングの利点を排除するCNNの事前訓練のために、別のラベルの付いたデータセットを使用する必要があります。つまり、LSTMの対象となる最終的な目的のための機能の学習です。最初の場所に追加のラベル)。
  • 2番目のオプションは、 次元(4-D Tensor)のバッチ内のすべてのタイムスライスを連結し、CNNにフィードし、何らかの形でそれらを再トレーニングしてLSTMのトレーニングに必要な5-D Tensorに再パックし、 。私の主な関心事は、それが可能なのかどうかです。また、可変長シーケンスを処理することはややこしいことになります。たとえば、予測シナリオでは、その時点で1つのフレームのみをフィードします。したがって、それが合同訓練を行う正しい方法であるなら、私はいくつかの例を見て本当にうれしいです。それに加えて、このソリューションはハックのように見えます。そのため、より良い方法があれば誰かがそれを共有することができれば幸いです。

ありがとうございます!

答えて

1

共同トレーニングの場合は、ドキュメント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よりも大きい場合は、ここでhttps://www.tensorflow.org/tutorials/using_gpuを説明するように、デバイスの配置を検討する必要がある場合があります。

ビデオバッチをフラット化して画像バッチを作成し、CNNからフォワードパスを行い、LSTMの機能を変更することもできます。

関連する問題