将神经网络输出限制在 0 和 1 之间的简单方法?
Easy way to clamp Neural Network outputs between 0 and 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'].
有没有人知道更好的方法或修复此错误的方法?
谢谢!
您可以应用来自 Keras 的 ReLU
层作为最后一层并设置 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
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)
所以我正在编写一个 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_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
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)