![](/img/trans.png)
[英]Item Assignment Tensorflow 2.0 - TypeError: 'tensorflow.python.framework.ops.EagerTensor' object does not support item assignment
[英]TypeError: 'Tensor' object does not support item assignment in 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
看來我無法分配給張量,我該如何解決?
通常,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
對象。
另一種方法你可以這樣做。
aa=tf.Variable(tf.zeros(3, tf.int32))
aa=aa[2].assign(1)
那么輸出是:
數組([0, 0, 1], dtype=int32)
參考: https : //www.tensorflow.org/api_docs/python/tf/Variable#assign
當您已經有了張量時,使用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)
正如這條評論所說,一種解決方法是創建一個新的張量,其中包含前一個張量,並在所需區域上創建一個新張量。
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
tf.Tensor
和tf.Variable
都不是元素可賦值的。 但是,有一個技巧當然不是最有效的方法,尤其是當您迭代地執行此操作時。
您可以使用新值創建一個mask
和一個new_layer
張量,然后
做一個 Hadamard 產品(元素產品)。
x = original * mask + new_layer * (1-mask)
original * mask
部分將original
的指定值設置為 0,第二部分new_layer*(1-mask)
將new_layer
張量分配為您想要的任何內容,而無需修改上一步中通過mask
張量分配給 0 的元素。
另一種方法是使用 numpy 代替:
x = np.zeros((tensor dimensions))
使用 Pytorch:
x = torch.zeros((tensor dimensions))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.