web-dev-qa-db-fra.com

TypeError: l'objet 'Tensor' ne prend pas en charge l'attribution d'élément dans TensorFlow

J'essaie d'exécuter ce code:

outputs, states = rnn.rnn(lstm_cell, x, initial_state=initial_state, sequence_length=real_length)

tensor_shape = outputs.get_shape()
for step_index in range(tensor_shape[0]):
    Word_index = self.x[:, step_index]
    Word_index = tf.reshape(Word_index, [-1,1])
    index_weight = tf.gather(Word_weight, Word_index)
    outputs[step_index,  :,  :]=tf.mul(outputs[step_index,  :,  :] , index_weight)

Mais je reçois une erreur sur la dernière ligne: TypeError: 'Tensor' object does not support item assignment Il semble que je ne puisse pas attribuer au tenseur, comment puis-je le réparer?

18
Nils Cao

En général, un objet tensoriel TensorFlow n'est pas assignable *, vous ne pouvez donc pas l'utiliser sur le côté gauche d'une affectation.

La façon la plus simple de faire ce que vous essayez de faire est de construire une Python liste de tenseurs, et tf.stack() les ensemble à la fin de la boucle:

outputs, states = rnn.rnn(lstm_cell, x, initial_state=initial_state,
                          sequence_length=real_length)

output_list = []

tensor_shape = outputs.get_shape()
for step_index in range(tensor_shape[0]):
    Word_index = self.x[:, step_index]
    Word_index = tf.reshape(Word_index, [-1,1])
    index_weight = tf.gather(Word_weight, Word_index)
    output_list.append(tf.mul(outputs[step_index, :, :] , index_weight))

outputs = tf.stack(output_list)

* À l'exception des objets tf.Variable , en utilisant les méthodes Variable.assign() etc. Cependant, rnn.rnn() renvoie probablement un objet tf.Tensor qui ne prend pas en charge cette méthode.

26
mrry

Une autre façon de le faire comme ça.

aa=tf.Variable(tf.zeros(3, tf.int32))
aa=aa[2].assign(1)

alors la sortie est:

tableau ([0, 0, 1], dtype = int32)

réf: https://www.tensorflow.org/api_docs/python/tf/Variable#assign

5
xiangshu lin

Lorsque vous avez déjà un tenseur, convertissez-le en une liste en utilisant tf.unstack (TF2.0), puis utilisez tf.stack comme @mrry l'a mentionné. (lors de l'utilisation d'un tenseur multidimensionnel, soyez conscient de l'argument axe dans unstack)

a_list = tf.unstack(a_tensor)

a_list[50:55] = [np.nan for i in range(6)]

a_tensor = tf.stack(a_list)
2
yuvaraj8blr