这是我的问题。我有一个张量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张量(?,)。
答案 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变量,改变它,然后再把它放回去。
对于性能关键的事情,不要使用它,因为它效率不高。