【问题标题】:Assigning zero to tensor at indices specified in a list在列表中指定的索引处将零分配给张量
【发布时间】:2018-11-04 10:11:26
【问题描述】:

我必须张量,例如

A = tf.Tensor(
       [[1.0986123 0.6931472 0.        0.6931472 0.       ]
        [0.        0.        0.        0.        0.       ]
        [3.7376697 3.7612002 3.7841897 3.8066626 3.8286414]], shape=(3, 5), dtype=float32)

B = tf.Tensor(
   [[2 1]
    [2 2]], shape=(2, 2), dtype=int64)

张量 B 在张量 A 中保存索引。我想将张量 A 中的每个值更新为索引列表 B 中列出的零。

所以,预期的结果是

tf.Tensor(
       [[1.0986123 0.6931472 0.        0.6931472 0.       ]
        [0.        0.        0.        0.        0.       ]
        [3.7376697 0 0 3.8066626 3.8286414]], shape=(3, 5), dtype=float32)

因此索引 [2,1] 和 [2, 2] 处的条目设置为 0。

我查看了tf.assign,但它们只能用于tf.Variabletf.boolean_mask 将是一个不错的方法,但我不知道也无法找到如何创建带有索引列表的布尔掩码。

我查看了我能找到的张量流函数和相关的 S/O 答案,但找不到令人满意的解决方案。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    您可以为此使用tf.scatter_nd_update。例如:

    A = tf.Variable(
        [[1.0986123, 0.6931472, 0.       , 0.6931472, 0.       ],
         [0.       , 0.       , 0.       , 0.       , 0.       ],
         [3.7376697, 3.7612002, 3.7841897, 3.8066626, 3.8286414]], dtype=tf.float32)
    
    B = tf.Variable(
        [[2, 1],
         [2, 2]], dtype=tf.int64)
    
    C = tf.scatter_nd_update(A, B, tf.zeros(shape=tf.shape(B)[0]))
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run(C))
    

    A = tf.constant(
        [[1.0986123, 0.6931472, 0.       , 0.6931472, 0.       ],
         [0.       , 0.       , 0.       , 0.       , 0.       ],
         [3.7376697, 3.7612002, 3.7841897, 3.8066626, 3.8286414]], dtype=tf.float32)
    
    B = tf.constant(
        [[2, 1],
         [2, 2]], dtype=tf.int64)
    
    AV = tf.Variable(A)
    
    C = tf.scatter_nd_update(AV, B, tf.zeros(shape=tf.shape(B)[0]))
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run(C))
    

    【讨论】:

    • 谢谢!我的张量来自 Dataset api,所以它们不是 tf.Variable 的。我想我可以从传入的张量创建一个变量,应用scatter_nd_update,然后再次将其转换为张量。哈克但它有效:tf.convert_to_tensor(tf.scatter_nd_update(tf.contrib.eager.Variable(input_data), index_list, tf.zeros(shape=tf.shape(index_list)[0])))
    • 我想继续研究是否有不使用变量的解决方案,可能使用tf.boolean_mask,如果我没有找到可以接受你的答案
    • 我用常量而不是变量添加代码。这与 tf.Tensor 的行为相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2019-05-07
    • 2022-10-18
    • 2016-06-02
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多