簡體   English   中英

TypeError: 'Tensor' object 不支持 TensorFlow 中的項目分配

[英]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)

正如這條評論所說,一種解決方法是創建一個新的張量,其中包含前一個張量,並在所需區域上創建一個張量。

  1. 創建一個形狀outputs掩碼,在要替換的索引上為 0,在其他地方為 1(也可以與TrueFalse
  2. 使用新的所需值創建新的形狀outputs矩陣: new_values
  3. 僅替換需要的索引: outputs_new = outputs* mask + new_values * (1 - mask)

如果您願意為我提供 MWE,我可以為您編寫代碼。

一個很好的參考是這個注釋: How to Replace Values by Index in a Tensor with TensorFlow-2.0

  1. tf.Tensortf.Variable都不是元素可賦值的。 但是,有一個技巧當然不是最有效的方法,尤其是當您迭代地執行此操作時。

    您可以使用新值創建一個mask和一個new_layer張量,然后

    做一個 Hadamard 產品(元素產品)。

     x = original * mask + new_layer * (1-mask)

    original * mask部分將original的指定值設置為 0,第二部分new_layer*(1-mask)new_layer張量分配為您想要的任何內容,而無需修改上一步中通過mask張量分配給 0 的元素。

  2. 另一種方法是使用 numpy 代替:

     x = np.zeros((tensor dimensions))
  3. 使用 Pytorch:

     x = torch.zeros((tensor dimensions))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM