TypeError:'Tensor'对象不支持TensorFlow中的项目分配

时间:2016-06-08 08:55:21

标签: python 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 我似乎无法分配张量,我该如何解决呢?

4 个答案:

答案 0 :(得分:24)

通常,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 :(得分:5)

你可以这样做的另一种方式。

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

然后输出是:

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

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

答案 2 :(得分:3)

已经有张量时, 使用tf.unstack(TF2.0)将张量转换为列表,然后使用@mrry提到的tf.stack。 (使用多维张量时,请注意unstack中的轴参数)

a_list = tf.unstack(a_tensor)

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

a_tensor = tf.stack(a_list)

答案 3 :(得分:0)

正如comment所说,一种解决方法是在所需区域上创建一个 NEW 张量,其中前一个张量和一个新的张量。

  1. 创建一个形状为outputs的蒙版,其中要替换的索引上带有0,其他位置为1(也可以与TrueFalse一起使用)
  2. 使用新的所需值创建一个形状为outputs的新矩阵:new_values
  3. 仅用outputs_new = outputs* mask + new_values * (1 - mask)
  4. 替换所需的索引。

如果您要为我提供MWE,我可以为您提供代码。

此注释很好参考:How to Replace Values by Index in a Tensor with TensorFlow-2.0