在张量流中操纵矩阵元素

时间:2016-03-03 10:44:59

标签: matrix indexing element variable-assignment tensorflow

如何在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])

1 个答案:

答案 0 :(得分:18)

您无法更改张量 - 但是,正如您所指出的,您可以更改变量。

您可以使用三种模式来完成您想要的任务:

(a)使用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(),不包括您要更改的项目,然后tf.concat(0, [a, 0, b])将它们重新组合在一起。

(c)创建b = tf.zeros_like(a),然后使用tf.select()选择您想要的a项,以及b中您想要的哪些项。

我已经包含了(b)和(c),因为它们适用于普通张量,而不仅仅是变量。