首页 > 解决方案 > 将神经网络输出限制在 0 和 1 之间的简单方法?

问题描述

所以我正在编写一个 GAN 神经网络,如果它小于 0,我想将网络的输出设置为 0,如果它大于 1,则设置为 1,否则保持不变。我对 tensorflow 很陌生,但我不知道有任何 tensorflow 功能或激活来做到这一点而不会产生不必要的副作用。所以我做了我的损失函数,所以它计算损失,就好像输出被钳位一样,使用以下代码:

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'].

有谁知道这样做的更好方法或解决此错误的方法?

谢谢!

标签: tensorflowneural-networknlpgenerative-adversarial-network

解决方案


您可以将ReLUKeras 中的图层应用为最终图层并设置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


推荐阅读