【问题标题】:Manipulating matrix elements in tensorflow在张量流中操作矩阵元素
【发布时间】:2016-06-16 15:32:02
【问题描述】:

如何在 tensorflow 中执行以下操作?

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

我不能使用 [] 括号,因为它只适用于常量而不适用于 变量。我也不能使用 slice 函数,因为它返回一个张量并且你不能分配给一个张量。

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

【问题讨论】:

    标签: matrix indexing element variable-assignment tensorflow


    【解决方案1】:

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

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

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

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

    我将 (b) 和 (c) 包括在内,因为它们适用于正态张量,而不仅仅是变量。

    【讨论】:

    • 非常感谢,这肯定是有帮助的,我可以使用它,但它会有点麻烦。如果我真的需要改变张量怎么办?有没有办法做到这一点?我想实现网络可视化,我需要将图像传播到激活层,将除随机激活之外的所有激活归零,然后将其传播回去。
    • 张量是不可变的。一般来说,如果你想保存和改变状态,你会将它存储在一个变量中,你可以改变它。但除此之外,您只需创建一个从原始张量派生的新张量并使用它。在您描述的情况下,这可能就是这种方法。
    • 感谢您的回答。我按照您的建议使用从原始张量派生的新张量解决了这个问题。
    • 我在我的 tensorflow 版本 1.0.0 中找不到 tf.select。有替代品吗?
    • tf.select 更改为 tf.where,就像自 tf 1.0 以来的 np.where
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2019-04-21
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多