剪切(过滤)tf.placeholder值

时间:2018-01-26 03:13:17

标签: tensorflow

我想更改我的tf.placeholder值,以便:

值< SmallConstant设置为0。

它不完全剪裁,所以我无法使用:tf.clip_by_value()

我在Conditional assignment of tensor values in TensorFlow中尝试了这个建议,这就是我到目前为止所做的:

x = tf.placeholder(tf.float32, None)
condition = tf.less(x, tf.constant(SmallConst))
tf.assign(x, tf.where(condition, tf.zeros_like(x), x))

然而,在运行时,我收到错误

AttributeError: 'Tensor' object has no attribute 'assign'

似乎tf.assign()可以在tf.Variable上完成,但不能在tf.placeholder上完成。

我还有其他办法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,它比你想象的更容易:

x = tf.placeholder(tf.float32, None)
# create a bool tensor the same shape as x
condition = x < SmallConst 

# create tensor same shape as x, with values greater than SmallConst set to 0
to_remove = x*tf.to_float(condition)

# set all values of x less than SmallConst to 0
x_clipped = x - to_remove 

我通常把它放在一行中,如:

x_clipped = x - x*tf.to_float(x < small_const)

注意:tf.to_float类型的张量上使用bool0.0代替False和{{1} }}代替1.0 s

更清洁代码的其他信息:

数值运算符(例如True<>=+等,但不是-)因张量流张量而过载,这样您就可以使用具有张量的本机python变量来获得作为该操作的结果的新张量。所以==实际上很少需要。这个实例的例子:

tf.constant()

numpy也是如此。

tf.assign()仅适用于变量,因为它将

  

通过为其指定'value'来更新'ref'。

张量流中的张量是不可变的。张量上任何运算的结果都是另一个张量,但原始张量永远不会改变。但是,变量是可变的,您可以使用a = tf.placeholder(tf.int32) b = a + 1 c = a > 0 print(b) # gives "<tf.Tensor 'add:0' shape=<unknown> dtype=int32>" print(c) # gives "<tf.Tensor 'Greater:0' shape=<unknown> dtype=bool>" sess.run(b, {a: 1}) # gives scalar int32 numpy array with value 2 sess.run(c, {a: 1}) # gives scalar bool numpy array with value True

更改其值