2

Il existe de nombreux exemples d'utilisation des LSTM en TF, mais je n'ai pas trouvé de bons exemples pour former conjointement CNN + LSTM. D'après ce que je vois, il est pas tout à fait simple comment faire une telle formation, et je ne peux penser à quelques options:Tensorflow: formation conjointe CNN + LSTM

  • D'abord, je crois que la solution la plus simple (ou le plus primitif) serait former CNN indépendamment pour apprendre des fonctionnalités et ensuite pour former LSTM sur les fonctionnalités CNN sans mettre à jour la partie CNN, car il faudrait probablement extraire et enregistrer ces fonctionnalités en numpy puis les transmettre à LSTM dans TF. Mais dans ce scénario, il faudrait probablement utiliser un ensemble de données étiqueté différemment pour le pré-apprentissage de CNN, ce qui élimine l'avantage de l'entraînement de bout en bout, c'est-à-dire l'apprentissage des caractéristiques de l'objectif final ciblé par LSTM. étiquettes supplémentaires en premier lieu).
  • La deuxième option consisterait à concaténer toutes les tranches de temps dans la dimension (4-d Tensor), l'alimenter en CNN et en quelque sorte reconditionner ces caractéristiques en 5-d tensor encore nécessaire pour la formation LSTM, puis appliquer une fonction de coût . Ma principale préoccupation, c'est s'il est possible de faire une telle chose. En outre, la manipulation de séquences de longueur variable devient un peu difficile. Par exemple, dans le scénario de prédiction, vous ne nourririez qu'une seule image à la fois. Ainsi, je serais vraiment heureux de voir quelques exemples si c'est la bonne façon de faire une formation conjointe. En plus de cela, cette solution ressemble plus à un hack, donc, s'il y a une meilleure façon de le faire, ce serait génial si quelqu'un pouvait le partager.

Merci d'avance!

Répondre

1

Pour la formation conjointe, vous pouvez envisager d'utiliser tf.map_fn comme décrit dans la documentation https://www.tensorflow.org/api_docs/python/tf/map_fn. Supposons que le CNN est construit sur des lignes similaires à celles décrites ici 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 

Attention: Vous pourriez avoir à regarder dans le placement de l'appareil comme décrit ici https://www.tensorflow.org/tutorials/using_gpu si votre modèle est plus grand que le gpu mémoire peut allouer. Une alternative serait d'aplatir le lot vidéo pour créer un lot d'images, faire une passe avant de CNN et remodeler les fonctionnalités pour LSTM.