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

时间:2016-12-08 16:11:19

标签: 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张量(?,)。

4 个答案:

答案 0 :(得分:15)

实际上,您的问题与计算rectifier activation function完全相同,而TensorFlow有一个内置运算符tf.nn.relu(),可以完全满足您的需求:

X_with_negatives_set_to_zero = tf.nn.relu(X)

答案 1 :(得分:3)

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

t = tf.clip_by_value(t, min_val, max_val)

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

答案 2 :(得分:0)

一个简单的解决方案是使用强制转换功能keras documentation(如@ldavid所建议)

X = tf.cast(X > 0, X.dtype) * X

此外,可以使用以下方法将其调整为任何阈值级别:

X = tf.cast(X > threshold, X.dtype) * X

答案 3 :(得分:-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]

虽然这可以满足你的需要,但它并没有在tensorflow中完成。我们正在拉出一个tensorflow变量,改变它,然后再把它放回去。

对于性能关键的事情,不要使用它,因为它效率不高。