我尝试运行此代码:
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
我似乎无法分配张量,我该如何解决呢?
答案 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 张量,其中前一个张量和一个新的张量。
outputs
的蒙版,其中要替换的索引上带有0,其他位置为1(也可以与True
和False
一起使用)outputs
的新矩阵:new_values
outputs_new = outputs* mask + new_values * (1 - mask)
如果您要为我提供MWE,我可以为您提供代码。
此注释很好参考:How to Replace Values by Index in a Tensor with TensorFlow-2.0