Comment utiliser return_sequences option et TimeDistributed couche dans Keras?
J'ai un corpus de dialogue comme ci-dessous. Et je tiens à mettre en œuvre un LSTM modèle qui prédit un système d'action. Le système d'action est décrit comme un vecteur de bits. Et une entrée de l'utilisateur est calculé comme un mot d'intégration qui est aussi un vecteur de bits.
t1: user: "Do you know an apple?", system: "no"(action=2)
t2: user: "xxxxxx", system: "yyyy" (action=0)
t3: user: "aaaaaa", system: "bbbb" (action=5)
Donc ce que je veux comprendre, c'est "plusieurs à plusieurs (2)" modèle. Quand mon modèle reçoit une entrée de l'utilisateur, il doit la sortie d'un système d'action.
Mais je ne comprends pas return_sequences
option et TimeDistributed
couche après LSTM. Pour réaliser "plusieurs-à-plusieurs (2)", return_sequences==True
et l'ajout d'un TimeDistributed
après LSTMs sont nécessaires? Je reconnaissants si vous souhaitez donner plus de description.
return_sequences: Boolean. Que ce soit pour retourner à la dernière sortie dans la séquence de sortie, ou de la séquence complète.
TimeDistributed: Ce gestionnaire vous permet d'appliquer un calque pour chaque tranche temporelle d'une entrée.
Mis à jour 2017/03/13 17:40
Je pense que je pourrais comprendre la return_sequence
option. Mais je ne suis pas encore sûr de TimeDistributed
. Si j'ajoute un TimeDistributed
après LSTMs, est le modèle de la même chose que "mon plusieurs-à-plusieurs(2)" ci-dessous? Donc je pense que les couches Denses sont appliqués pour chaque sortie.
- Est TimeDistributed censé être utilisé dans un/plusieurs à plusieurs"? Et si j'utilise TimeDistributed, return_sequences doit être Vrai. Suis-je le droit?
- Pourrais-je savoir si les actions sont limitées et prédéfinis ou pas?
- Votre système est-il la réponse dépendent précédent l'entrée de l'utilisateur?
Vous devez vous connecter pour publier un commentaire.
La LSTM et la couche de la TimeDistributed wrapper sont deux façons différentes pour obtenir le "plusieurs à plusieurs" de la relation que vous souhaitez.
Comme vous pouvez le voir, la différence entre les deux est que la LSTM "propage les informations par le biais de la séquence, il va manger en un mot, de mise à jour de son état et de le retourner ou pas. Puis il va continuer avec le mot suivant, tout en gardant l'information des précédents.... comme dans le TimeDistributed, les mots seront traitées de la même façon sur leur propre, comme s'ils étaient dans des silos et de la même couche s'applique à chacun d'eux.
De sorte que vous n'avez pas à utiliser LSTM et TimeDistributed dans une rangée, vous pouvez faire ce que vous voulez, il suffit de garder à l'esprit ce que chacun d'entre eux.
J'espère que c'est plus clair?
EDIT:
La fois distribué, dans votre cas, s'applique une couche dense de chaque élément qui a été sortie par la LSTM.
Prenons un exemple:
Vous avez une séquence de n_words mots qui sont incorporés dans emb_size dimensions. Si votre entrée est un 2D tenseur de forme
(n_words, emb_size)
D'abord, vous appliquez un LSTM avec la dimension de sortie =
lstm_output
etreturn_sequence = True
. La sortie sera toujours une squence de sorte qu'il sera un 2D tenseur de forme(n_words, lstm_output)
.Si vous avez n_words vecteurs de longueur lstm_output.
Maintenant vous appliquez un TimeDistributed couche dense à dire 3 dimensions de sortie en tant que paramètre de la densité. Donc TimeDistributed(Dense(3)).
Cela s'applique Dense(3) n_words fois, à tous les vecteurs de taille lstm_output dans votre séquence, indépendamment... ils vont tous devenir des vecteurs de longueur 3. Votre sortie sera toujours une séquence 2D tenseur, de forme maintenant
(n_words, 3)
.Est-il plus clair? 🙂
Si Nous voulons avoir une séquence pour la sortie, et pas seulement un seul vecteur comme nous l'avons fait avec la normale de Réseaux de Neurones, il est donc nécessaire que nous nous sommes fixé le return_sequences de Vrai. Concrètement, imaginons que nous avons une entrée de la forme (num_seq, seq_len, num_feature). Si nous ne fixons pas les return_sequences=True, notre sortie de la forme (num_seq, num_feature), mais si nous le faisons, nous allons obtenir la sortie avec la forme (num_seq, seq_len, num_feature).
Depuis que nous avons mis return_sequences=True dans la LSTM couches, la sortie est maintenant un trois-dimension du vecteur. Si nous sommes à l'entrée que dans la couche Dense, il déclenche une erreur parce que la couche Dense accepte uniquement en deux dimensions d'entrée. Pour l'entrée d'un trois-dimension du vecteur, nous avons besoin d'utiliser un wrapper couche appelée TimeDistributed. Cette couche va nous aider à maintenir la sortie est de la forme, de sorte que nous pouvons atteindre une séquence de sortie à la fin.