Простой способ ограничить выходы нейронной сети между 0 и 1? - PullRequest
1 голос
/ 28 мая 2020

Итак, я работаю над написанием нейронной сети GAN, и я хочу установить выход моей сети на 0, если он меньше 0 и 1, если он больше 1, и оставить его без изменений в противном случае. Я новичок в тензорном потоке, но я не знаю ни одной функции тензорного потока или активации, чтобы сделать это без нежелательных побочных эффектов. Итак, я сделал свою функцию потерь, чтобы она вычисляла потери, как если бы вывод был заблокирован, с помощью этого кода:

def discriminator_loss(real_output, fake_output):
    real_output_clipped = min(max(real_output.numpy()[0], 
    0), 1)
    fake_output_clipped = min(max(fake_output.numpy()[0], 
    0), 1)

    real_clipped_tensor = 
    tf.Variable([[real_output_clipped]], dtype = "float32")
    fake_clipped_tensor = 
    tf.Variable([[fake_output_clipped]], dtype = "float32")

    real_loss = cross_entropy(tf.ones_like(real_output), 
    real_clipped_tensor)
    fake_loss = cross_entropy(tf.zeros_like(fake_output), 
    fake_clipped_tensor)

    total_loss = real_loss + fake_loss
    return total_loss

, но я получаю эту ошибку:

ValueError: No gradients provided for any variable: ['dense_50/kernel:0', 'dense_50/bias:0', 'dense_51/kernel:0', 'dense_51/bias:0', 'dense_52/kernel:0', 'dense_52/bias:0', 'dense_53/kernel:0', 'dense_53/bias:0'].

Кто-нибудь знает лучший способ сделать это или способ исправить эту ошибку?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Вы можете применить слой ReLU из Keras в качестве последнего слоя и установить max_value=1.0. Например:

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(32, input_shape=(16,)))
model.add(tf.keras.layers.Dense(32))
model.add(tf.keras.layers.ReLU(max_value=1.0))

Подробнее об этом можно прочитать здесь: https://www.tensorflow.org/api_docs/python/tf/keras/layers/ReLU

1 голос
/ 29 мая 2020

TF, вероятно, не знает, как обновить веса вашей сети на основе этой потери. Входными данными кросс-энтропии являются тензоры (переменные), которые напрямую назначаются из numpy массивов и не связаны с вашими фактическими сетевыми выходами.

Если вы хотите выполнять операции с тензорами, которые останутся в графе и (надеюсь) быть дифференцированным, используя доступные операции TF. Здесь описана операция clip_by_value: https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/clip_by_value.

Например, real_output_clipped = tf.clip_by_value(real_output, clip_value_min=0, clip_value_max=1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...