我想更改我的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
上完成。
我还有其他办法吗?
谢谢!
答案 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
类型的张量上使用bool
将0.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