Je ne sais pas quelle est la bonne façon d'utiliser le tenseur d'état initial dans Tensorflow pour les RNN. Il y a presque une répartition 50/50 entre les tortues qui utilisent soit LSTMStateTuple ou cell.zero_state .
Les deux sont-ils les mêmes? Si oui, pourquoi y a-t-il deux façons?
Dans un exemple, ils utilisent tf.nn.rnn_cell.LSTMStateTuple
Pour définir l'état initial et dans l'autre, ils utilisent cell.zero_state()
.
Pourquoi y a-t-il deux méthodes? Quand préférer l'un ou l'autre? Pouvez-vous utiliser uniquement LSTMStateTuple
lorsque vous définissez state_is_Tuple
? Si c'est le cas, cell.zero_state()
ne fonctionne plus?
Les deux choses sont différentes. state_is_Tuple
Est utilisé sur les cellules LSTM car l'état des cellules LSTM est un Tuple. cell.zero_state
Est l'initialiseur de l'état pour toutes les cellules RNN.
Vous préférerez généralement la fonction cell.zero_state
Car elle initialisera la classe d'état requise selon que state_is_Tuple
Est vrai ou non.
Voir this Problème GitHub où vous pouvez voir le cell.zero_state
Recommandé - "utilisez la fonction zero_state sur l'objet cellule".
Une autre raison pour laquelle vous voudrez peut-être cell.zero_state
Est parce qu'elle est indépendante du type de cellule (LSTM, GRU, RNN) et vous pouvez faire quelque chose comme ceci:
if type == 'GRU':
cell = BasicGRUCell
else:
cell = BasicLSTMCell(state_is_Tuple=True)
init_state = cell.zero_state(batch_size)
l'état initial étant OK.
LSTMStateTuple
ne fonctionnera que sur les cellules dont l'état est un Tuple.
Quand utiliser LSTMStateTuple?
Vous voudrez utiliser LSTMStateTuple
lorsque vous initialisez votre état avec des valeurs personnalisées (transmises par le formateur). cell.zero_state()
renverra l'état avec toutes les valeurs égales à 0,0.
Si vous souhaitez conserver l'état entre les lots, vous devrez l'obtenir après chaque lot et l'ajouter à votre feed_dict
Le prochain lot.
Voir this pour une explication sur la raison pour laquelle l'état LSTM est un tuple.