张量流中的按元素分配

时间:2018-08-07 03:13:58

标签: numpy tensorflow

numpy中,可以很容易地完成

>>> img
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]], dtype=int32)
>>> img[img>5] = [1,2,3,4]
>>> img
array([[1, 2, 3],
       [4, 5, 1],
       [2, 3, 4]], dtype=int32)

但是,在张量流中似乎不存在类似的操作。

2 个答案:

答案 0 :(得分:2)

您永远无法为张量流中的张量分配值,因为无法通过反向传播来追踪张量值的变化,但是您仍然可以从原始张量中获得另一个张量,这是解决方法

import tensorflow as tf
tf.enable_eager_execution()
img = tf.constant(list(range(1, 10)), shape=[3, 3])
replace_mask = img > 5
keep_mask = tf.logical_not(replace_mask)
keep = tf.boolean_mask(img, keep_mask)

keep_index = tf.where(keep_mask)
replace_index = tf.where(replace_mask)

replace = tf.random_uniform((tf.shape(replace_index)[0],), 0, 10, tf.int32)

updates = tf.concat([keep, replace], axis=0)
indices = tf.concat([keep_index, replace_index], axis=0)

result = tf.scatter_nd(tf.cast(indices, tf.int32), updates, shape=tf.shape(img))

答案 1 :(得分:0)

实际上,有一种方法可以实现这一目标。与@ Jie.Zhou的答案非常相似,您可以将tf.constant替换为tf.Variable,然后将tf.scatter_nd替换为tf.scatter_nd_update