Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 将神经网络输出钳制在0和1之间的简单方法?_Tensorflow_Neural Network_Nlp_Generative Adversarial Network - Fatal编程技术网

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

Tensorflow 将神经网络输出钳制在0和1之间的简单方法?,tensorflow,neural-network,nlp,generative-adversarial-network,Tensorflow,Neural Network,Nlp,Generative Adversarial Network,所以我正在写一个GAN神经网络,我想把网络的输出设置为0,如果它小于0,如果它大于1,则设置为1,否则保持不变。我对tensorflow非常陌生,但我不知道有任何tensorflow函数或激活可以做到这一点,而不会产生不必要的副作用。所以我做了损耗函数,它计算损耗就像输出被钳制一样,代码如下: def discriminator_loss(real_output, fake_output): real_output_clipped = min(max(real_output.numpy(

所以我正在写一个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'].
有人知道更好的方法吗?或者知道修复此错误的方法吗


谢谢

您可以应用Keras的
ReLU
层作为最终层,并将
max\u值设置为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))

您可以在此处阅读更多信息:

您可以应用Keras的
ReLU
层作为最终层,并设置
max\u值=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))

您可以在此处了解更多信息:

TF可能不知道如何根据此损失更新网络权重。交叉熵的输入是直接从numpy数组分配的张量(变量),与实际网络输出无关

如果您想对将保留在图中且(希望)可微的张量执行操作,请使用可用的TF操作。这里描述了一个“clip\u by\u value”操作:


例如,
real\u output\u clipped=tf.clip\u by\u value(real\u output,clip\u value\u min=0,clip\u value\u max=1)

tf可能不知道如何根据此损失更新网络权重。交叉熵的输入是直接从numpy数组分配的张量(变量),与实际网络输出无关

如果您想对将保留在图中且(希望)可微的张量执行操作,请使用可用的TF操作。这里描述了一个“clip\u by\u value”操作:

例如,
real\u output\u clipped=tf.clip\u by\u value(real\u output,clip\u value\u min=0,clip\u value\u max=1)