将张量的所有负值设置为零(在tensorflow中)

dfr*_*an1 4 tensorflow

这是我的问题.我有一个张量X,我想将所有负值设置为零.在numpy,我会做以下np.maximum(0, X).有没有办法在张量流中达到相同的效果?我试过了tf.maximum(tf.fill(X.get_shape(), 0.0), X),但这个抛出ValueError: Cannot convert a partially known TensorShape to a Tensor: (?,).

PS.X是形状的1-D张量(?,).

mrr*_*rry 17

实际上,您的问题与计算整流器激活功能完全相同,而TensorFlow有一个内置运算符tf.nn.relu(),它可以完全满足您的需求:

X_with_negatives_set_to_zero = tf.nn.relu(X)
Run Code Online (Sandbox Code Playgroud)

  • 这很聪明.另一个简单的解决方案是`X = tf.cast(X> 0,X.dtype)*X`. (8认同)

小智 5

您可以使用 tf.clip_by_value 函数如下:

t = tf.clip_by_value(t, min_val, max_val)
Run Code Online (Sandbox Code Playgroud)

它将在 [min_val, max_val] 范围内裁剪张量 t。在这里,您可以将 min_val 设置为 0 以裁剪所有负值并将其设置为 0。有关clip_by_value 的更多文档。

  • 那么 max_val 里应该放什么? (3认同)

may*_*k93 -1

一种可能的解决方案可能是这样的(尽管它不是最好的):

class TensorClass(object):
    def __init__(tensor_values):
        self.test_tensor = tf.Variable(tensor_values, name="test_tensor")

test_session = tf.Session()
with test_session.as_default():
    tc = TensorClass([1, -1, 2, -2, 3])
    test_session.run(tf.initialize_all_variables())
    test_tensor_value = test_session.run(tc.test_tensor)
    print(test_tensor_value) # Will print [1, -1, 2, -2, 3]
    new_test_tensor_value = [element * int(element > 0) for element in test_tensor_value]
    test_tensor_value_assign_op = tf.assign(tc.test_tensor, new_test_tensor_value)
    test_session.run(test_tensor_value_assign_op)
    test_tensor_value = test_session.run(tc.test_tensor)
    print(test_tensor_value) # Will print [1 0 2 0 3]
Run Code Online (Sandbox Code Playgroud)

虽然这可以满足您的需要,但它不是在张量流中完成的。我们正在取出一个张量流变量,对其进行更改,然后再次将其放回去。

对于性能关键的事情,不要使用它,因为它不是很有效。