限制 NN 输出的最大值在 Tensorflow/Keras 内为正
Restrict NN outputs' maximum to be positive in Tensorflow/Keras
我有一个神经网络可以输出多个输出 num_out
。
我知道如果我希望所有输出都是正的,我可以在输出层上应用 relu
激活函数(或其他)。
然而,我的目标是确保所有 num_out
输出中只有最大值为正。我找不到执行此操作的方法。
解决问题的一种方法是使用 tf.where
和 tf.reduce_max
:
import tensorflow as tf
x = tf.constant([
[-1, -2, -3],
[-4, -5, -6]
])
max_val = tf.reduce_max(x, keepdims=True)
new_max_val = tf.where(tf.greater(max_val, 0), max_val, tf.math.negative(max_val))
result = tf.where(tf.equal(x, max_val), tf.ones(tf.shape(x), dtype=x.dtype) * new_max_val, x)
print('Max value: ', max_val)
print('New Max value: ', new_max_val)
print('Result: ', result)
Max value: tf.Tensor([[-1]], shape=(1, 1), dtype=int32)
New Max value: tf.Tensor([[1]], shape=(1, 1), dtype=int32)
Result: tf.Tensor(
[[ 1 -2 -3]
[-4 -5 -6]], shape=(2, 3), dtype=int32)
我先求tensor中的最大值x
,如果为负则转为正值,否则保持不变。之后,我用新值更新张量 x
。如果张量中的最大值为正,则没有任何变化:
x = tf.constant([
[-1, -2, -3],
[ 4, 5, 6]
])
# -->
Max value: tf.Tensor([[6]], shape=(1, 1), dtype=int32)
New Max value: tf.Tensor([[6]], shape=(1, 1), dtype=int32)
Result: tf.Tensor(
[[-1 -2 -3]
[ 4 5 6]], shape=(2, 3), dtype=int32)
如果要确保除最大值以外的所有其他元素都是负数,则更改此行:
result = tf.where(tf.equal(x, max_val), tf.ones(tf.shape(x), dtype=x.dtype) * new_max_val, tf.abs(x)*-1)
Max value: tf.Tensor([[6]], shape=(1, 1), dtype=int32)
New Max value: tf.Tensor([[6]], shape=(1, 1), dtype=int32)
Result: tf.Tensor(
[[-1 -2 -3]
[-4 -5 6]], shape=(2, 3), dtype=int32)
我有一个神经网络可以输出多个输出 num_out
。
我知道如果我希望所有输出都是正的,我可以在输出层上应用 relu
激活函数(或其他)。
然而,我的目标是确保所有 num_out
输出中只有最大值为正。我找不到执行此操作的方法。
解决问题的一种方法是使用 tf.where
和 tf.reduce_max
:
import tensorflow as tf
x = tf.constant([
[-1, -2, -3],
[-4, -5, -6]
])
max_val = tf.reduce_max(x, keepdims=True)
new_max_val = tf.where(tf.greater(max_val, 0), max_val, tf.math.negative(max_val))
result = tf.where(tf.equal(x, max_val), tf.ones(tf.shape(x), dtype=x.dtype) * new_max_val, x)
print('Max value: ', max_val)
print('New Max value: ', new_max_val)
print('Result: ', result)
Max value: tf.Tensor([[-1]], shape=(1, 1), dtype=int32)
New Max value: tf.Tensor([[1]], shape=(1, 1), dtype=int32)
Result: tf.Tensor(
[[ 1 -2 -3]
[-4 -5 -6]], shape=(2, 3), dtype=int32)
我先求tensor中的最大值x
,如果为负则转为正值,否则保持不变。之后,我用新值更新张量 x
。如果张量中的最大值为正,则没有任何变化:
x = tf.constant([
[-1, -2, -3],
[ 4, 5, 6]
])
# -->
Max value: tf.Tensor([[6]], shape=(1, 1), dtype=int32)
New Max value: tf.Tensor([[6]], shape=(1, 1), dtype=int32)
Result: tf.Tensor(
[[-1 -2 -3]
[ 4 5 6]], shape=(2, 3), dtype=int32)
如果要确保除最大值以外的所有其他元素都是负数,则更改此行:
result = tf.where(tf.equal(x, max_val), tf.ones(tf.shape(x), dtype=x.dtype) * new_max_val, tf.abs(x)*-1)
Max value: tf.Tensor([[6]], shape=(1, 1), dtype=int32)
New Max value: tf.Tensor([[6]], shape=(1, 1), dtype=int32)
Result: tf.Tensor(
[[-1 -2 -3]
[-4 -5 6]], shape=(2, 3), dtype=int32)