Ограничьте максимальный выход NN, чтобы он был положительным в Tensorflow/Keras

#python #tensorflow #keras #neural-network

Вопрос:

У меня есть нейронная сеть, которая выводит несколько выходов num_out .

Я знаю, что если я хочу, чтобы все выходные данные были положительными, я мог бы применить relu функцию активации (или другие) на выходном уровне.

Однако моя цель состоит в том, чтобы убедиться, что только максимальное значение среди всех num_out результатов является положительным. Я не могу найти способ обеспечить это.

Комментарии:

1. Может быть, вы могли бы предоставить свой код ?

Ответ №1:

Один из способов решить вашу проблему-использовать 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)  

Сначала я нахожу максимальное значение в тензоре x , а затем преобразую его в положительное значение, если оно отрицательное, в противном случае оно остается прежним. После этого я обновляю тензор x новым значением. Если наибольшее значение в вашем тензоре положительное, то ничего не меняется:

 x = tf.constant([  [-1, -2, -3],   [ 4, 5, 6]  ]) # --gt;  
 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)