2016-06-08 64 views
10

項任務,我嘗試運行這段代碼:類型錯誤:「張量」對象不支持TensorFlow

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) 

,但我得到的最後一行錯誤: TypeError: 'Tensor' object does not support item assignment 看來我不能分配給張量,我該如何解決它?

回答

17

通常,TensorFlow張量對象不可分配*,因此您不能在分配的左側使用它。

做你想做什麼,最簡單的方法是構建張量的Python列表,並tf.stack()在一起在循環的末尾:

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) 

  *隨着例外tf.Variable對象,使用Variable.assign()等方法。但是,rnn.rnn()可能會返回不支持此方法的tf.Tensor對象。

+1

魔獸,謝謝你了:) –

+0

注從TensorFlow 1.0開始,'tf.pack()'已被替換爲[tf.stack()](https://www.tensorflow.org/api_docs/python/tf/stack)。 – CNugteren

+0

我更新了答案以反映新的API。 – mrry

4

另一種方法,你可以這樣做。

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

則輸出是:

陣列([0,0,1],D型細胞= INT32)

REF:https://www.tensorflow.org/api_docs/python/tf/Variable#assign

+0

我試圖以這種方式實現時似乎出現錯誤: 'x = tf.Variable(tf.ones([1,2,2,3],tf.float32))' 'x = x [:,:,:1] .assign(2.0)' 'with tf.Session()as sess:' 'sess.run(tf.global_variables_initializer())' 'x_data = sess.run(x )' – Moondra

相關問題