4 votes

Tensorflow : formation conjointe CNN + LSTM

Il existe un certain nombre d'exemples sur la façon d'utiliser les LSTM seuls dans TF, mais je n'ai pas pu trouver de bons exemples sur la façon de former conjointement CNN + LSTM. D'après ce que je vois, il n'est pas tout à fait simple de faire une telle formation, et je peux penser à quelques options ici :

  • Tout d'abord, je pense que la solution la plus simple (ou la plus primitive) serait d'entraîner le CNN indépendamment pour apprendre les caractéristiques et ensuite d'entraîner le LSTM sur les caractéristiques du CNN sans mettre à jour la partie CNN, puisqu'il faudrait probablement extraire et enregistrer ces caractéristiques dans numpy et ensuite les alimenter au LSTM dans TF. Mais dans ce scénario, il faudrait probablement utiliser un ensemble de données étiquetées différemment pour le pré-entraînement du CNN, ce qui élimine l'avantage de l'entraînement de bout en bout, c'est-à-dire l'apprentissage des caractéristiques pour l'objectif final visé par le LSTM (outre le fait qu'il faut avoir ces étiquettes supplémentaires en premier lieu).
  • La deuxième option consiste à concaténer toutes les tranches de temps dans le lot. (tenseur 4-d), de l'envoyer à CNN, puis d'une manière ou d'une autre de replier ces caractéristiques à 5-d Tensor à nouveau nécessaire pour la formation LSTM et puis appliquer une fonction de coût. Ma principale préoccupation est de savoir s'il est possible de faire une telle chose. En outre, la gestion des séquences de longueur variable devient un peu délicate. Par exemple, dans un scénario de prédiction, vous n'alimentez qu'une seule image à la fois. Ainsi, je serais vraiment heureux de voir quelques exemples si c'est la bonne façon de faire de la formation conjointe. En outre, cette solution ressemble plus à un hack, donc, s'il y a une meilleure façon de faire, ce serait formidable si quelqu'un pouvait la partager.

Merci d'avance !

2voto

user7643996 Points 46

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 soit construit selon les mêmes principes que ceux décrits 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

Avertissement : Il se peut que vous deviez envisager le placement du dispositif comme décrit ici. https://www.tensorflow.org/tutorials/using_gpu si votre modèle est plus grand que la mémoire que le gpu peut allouer.

Une alternative serait d'aplatir le lot vidéo pour créer un lot d'images, de faire un passage en avant de CNN et de remodeler les caractéristiques pour LSTM.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X