将神经网络输出钳制在0和1之间的简便方法?

问题描述 投票:1回答:2

因此,我正在编写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'].

有人知道一种更好的方法或解决此错误的方法吗?

谢谢!

因此,我正在编写GAN神经网络,如果网络的输出小于0,我想将其输出设置为0,如果网络的输出大于1,则将其输出设置为1,否则将其保持不变。我对...很陌生...

tensorflow neural-network nlp gan
2个回答
2
投票

您可以将Keras的ReLU层应用为最后一层,并设置max_value=1.0。例如:


1
投票

TF可能不知道如何基于此损失来更新网络权重。交叉熵的输入是直接从numpy数组分配的张量(变量),并且未连接到实际的网络输出。

© www.soinside.com 2019 - 2024. All rights reserved.