J'essaie de commencer à apprendre sur les RNN et j'utilise Keras. Je comprends le principe de base des couches RNN et LSTM à la vanille, mais j’ai du mal à comprendre un certain point technique pour la formation.
Dans la documentation de keras , il est indiqué que l’entrée dans une couche RNN doit avoir une forme (batch_size, timesteps, input_dim)
. Cela suggère que tous les exemples d'apprentissage ont une longueur de séquence fixe, à savoir timesteps
.
Mais ce n'est pas particulièrement typique, n'est-ce pas? Je souhaiterais peut-être que le RNN opère avec des phrases de durée variable. Lorsque je l’entraînerai sur un corpus, je le nourrirai de lots de phrases de longueurs différentes.
Je suppose que la chose la plus évidente à faire serait de trouver la longueur maximale d’une séquence dans l’ensemble d’entraînement et de la mettre à zéro. Mais alors cela signifie-t-il que je ne peux pas faire de prédiction au moment du test avec une longueur d'entrée supérieure à celle?
Je suppose que cette question concerne la mise en œuvre particulière de Keras, mais je demande aussi ce que les gens font généralement lorsqu'ils sont confrontés à ce type de problème en général.
Masking
layer to ignorRéponses:
Ce n’est pas tout à fait correct, puisque cette dimension peut être
None
, c’est-à-dire une longueur variable. Dans un même lot , vous devez avoir le même nombre de pas de temps (c'est généralement l'endroit où vous voyez le remplissage et le masquage 0). Mais entre les lots, il n'y a pas de telle restriction. Pendant l'inférence, vous pouvez avoir n'importe quelle longueur.Exemple de code qui crée des lots de données d’entraînement aléatoires dans le temps.
Et c'est ce que ça imprime. Notez que les formes en sortie
(None, None, x)
indiquent une taille de lot variable et une taille de pas variable.la source
fit()
, on peut passer lesequence_lenth
paramètre pour spécifier la longueur de la séquence à exclure. Il semble que l'approche du générateur ne permet pas d'ignorer les séquences 0?(inputs, targets, sample_weights)
et vous pouvez réglersample_weights
vos 0-pads à 0. Cependant, je ne suis pas sûr que cela fonctionnerait parfaitement pour les RNN bidirectionnels.model.predict_generator
avec un ensemble de test. Lorsque j'essaie de prédire avec un générateur, une erreur de concaténation se produit (l'ensemble de test comporte également des séquences de longueur variable). Ma solution a été d’utiliser la normemodel.predict
de manière simpliste. Peut-être que cela conviendrait mieux à une nouvelle question?@kbrose semble avoir une meilleure solution
C'est généralement une bonne solution. Essayez peut-être longueur maximale de séquence + 100. Utilisez ce qui convient le mieux à votre application.
Pas nécessairement. La raison pour laquelle une longueur fixe est utilisée dans les keras est qu’elle améliore considérablement les performances en créant des tenseurs de formes fixes. Mais ce n'est que pour la formation. Après la formation, vous aurez appris le poids qui convient à votre tâche.
Supposons qu'après des heures d'entraînement, vous réalisiez que la longueur maximale de votre modèle n'était pas assez grande / petite et que vous deviez maintenant modifier les pas de temps, extraire simplement les poids appris de l'ancien modèle, construire un nouveau modèle avec les nouveaux pas de temps. et injecter les poids appris en elle.
Vous pouvez probablement le faire en utilisant quelque chose comme:
new_model.set_weights(old_model.get_weights())
Je n'ai pas essayé moi-même. Essayez-le et publiez vos résultats ici pour le bénéfice de tous. Voici quelques liens: un deux
la source
max length + 100
. Voir ma réponse pour un exemple de code.Bidirectional(LSTM)()
et lesRepeatVector()
couches, et les prédictions sont parfaitement viables.