2016-03-03 2 views
8

Как я могу сделать следующее в тензорном потоке?Манипулирование матричными элементами в тензорном потоке

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]

(б) Создать два tf.slice() s тензора, за исключением элемента, который вы хотите изменить, а затем tf.concat(0, [a, 0, b]) их обратно вместе.

(с) Создание b = tf.zeros_like(a), а затем использовать tf.select() выбрать, какие элементы из a вы хотите, и какие нули из b, что вы хотите.

Я включил (b) и (c), потому что они работают с нормальными тензорами, а не только с переменными.

+0

Спасибо большое, это была определенная помощь, и я мог бы с этим справиться, но это было бы несколько combersome.What Если мне действительно нужно было изменить тензор? Нет ли способа сделать это? Я хочу реализовать сетевую визуализацию, и мне нужно распространять изображение до уровня активации, ноль всех активировок, кроме случайного, а затем распространять его обратно. – Shagas

+0

Тензоры неизменяемы. В общем случае, если вы хотите сохранить и изменить состояние, вы сохраните его в переменной, которую вы * можете * мутировать. Но в противном случае вы просто создаете новый тензор, полученный из оригинала, и используете его. В случае, когда вы описываете, это, вероятно, подход. – dga

+0

Спасибо за ответ. Я решил проблему, используя новый тензор, полученный из оригинала, как вы предложили. – Shagas

Смежные вопросы