2016-03-03 51 views
8

如何在tensorflow中執行以下操作?處理張量流中的矩陣元素

mat = [4,2,6,2,3] # 
mat[2] = 0 # simple zero the 3rd element 

我不能用括號[],因爲它僅適用於常量,而不是 變量。我不能使用切片函數,因爲它會返回一個張量,而您不能指定張量。

import tensorflow as tf 
sess = tf.Session() 
var1 = tf.Variable(initial_value=[2, 5, -4, 0]) 
assignZerosOP = (var1[2] = 0) # < ------ This is what I want to do 

sess.run(tf.initialize_all_variables()) 

print sess.run(var1) 
sess.run(assignZerosOP) 
print sess.run(var1) 

將打印

[2, 5, -4, 0] 
[2, 5, 0, 0]) 

回答

11

你不能改變一個張量 - 但是,正如你指出,你可以改變一個變量。

有三種模式,你可以用它來完成你想要的:

(一)使用tf.scatter_update直接捅到要改變變量的一部分。

import tensorflow as tf 

a = tf.Variable(initial_value=[2, 5, -4, 0]) 
b = tf.scatter_update(a, [1], [9]) 
init = tf.initialize_all_variables() 

with tf.Session() as s: 
    s.run(init) 
    print s.run(a) 
    print s.run(b) 
    print s.run(a) 

[2 5 -4 0]

[2 9 -4 0]

[2 9 -4 0]

(b)中創建兩個tf.slice()張量的s,不包括你想要改變的項目,然後將它們重新組合在一起。 (c)創建b = tf.zeros_like(a),然後使用tf.select()a中選擇您想要的項目以及您想要的b中的哪些零。

我已經包括(b)和(c),因爲它們與正常張量一起工作,而不僅僅是變量。

+0

非常感謝,這是肯定的幫助,我可以工作,但它會有點梳理。如果我真的需要改變張量?有沒有辦法做到這一點? 我想要實現網絡可視化,我需要傳播一個圖像到一個激活層,除了一個隨機的一個激活,然後將其傳播回來。 – Shagas

+0

張量是不可變的。一般來說,如果你想保存和改變狀態,你可以將它存儲在一個你可以*變異的變量中。但除此之外,您只需創建一個從原始派生的張量並使用它。在你描述的情況下,這可能是方法。 – dga

+0

感謝您的回答。正如你所建議的那樣,我用原始的張量來解決問題。 – Shagas