2016-06-08 41 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

相关问题