如何在 Keras 的功能 API 中实现 infoGAN 的损失函数

数据挖掘 机器学习 深度学习 喀拉斯 张量流
2022-03-10 02:43:13

我一直在尝试基于制作 infoGAN ,但它是纯张量流,我无法真正弄清楚如何在 Keras 中实现 Q_loss(最好是功能 API)。

这是我到目前为止所拥有的:

def G_loss(y_true, y_pred):
  return tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=y_pred,
                                                                labels=y_true))

def D_loss(y_true, y_pred):
  return tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=y_pred,
                                                                labels=y_true))

def Q_loss(y_true, y_pred):
  return ???

def get_generator():
  inputs = tf.keras.Input(shape=(noise_dim+c_dim,))
  x = tf.keras.layers.Dense(256, kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.02))(inputs)
  x = tf.keras.layers.LeakyReLU(0.2)(x)
  x = tf.keras.layers.Dense(512)(x)
  x = tf.keras.layers.LeakyReLU(0.2)(x)
  out = tf.keras.layers.Dense(784, activation=tf.nn.tanh)(x)
  generator = tf.keras.Model(inputs=inputs, outputs=out)
  generator.compile(optimizer=get_optimizer(), loss=G_loss)
  return generator

def get_discriminator():
  inputs = tf.keras.Input(shape=(784,))
  x = tf.keras.layers.Dense(1024, kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.02), \
                                  kernel_constraint=clipping(0.01), bias_constraint=clipping(0.01))(inputs)
  x = tf.keras.layers.LeakyReLU(0.2)(x)
  x = tf.keras.layers.Dense(512, kernel_constraint=clipping(0.01),
                                 bias_constraint=clipping(0.01))(x)
  x = tf.keras.layers.LeakyReLU(0.2)(x)
  x = tf.keras.layers.Dense(256, kernel_constraint=clipping(0.01),
                                 bias_constraint=clipping(0.01))(x)
  x = tf.keras.layers.LeakyReLU(0.2)(x)
  critic_output = tf.keras.layers.Dense(1, kernel_constraint=clipping(0.01),
                                           bias_constraint=clipping(0.01), name="critic_output")(x)
  x = tf.keras.layers.Dense(256, kernel_constraint=clipping(0.01),
                          bias_constraint=clipping(0.01))(critic_output)
  x = tf.keras.layers.LeakyReLU(0.2)(x)
  outputs = tf.keras.layers.Dense(c_dim, kernel_constraint=clipping(0.01),
                            bias_constraint=clipping(0.01))(x)
  discriminator = tf.keras.Model(inputs=inputs, outputs=[outputs, critic_output])
  discriminator.compile(optimizer=get_optimizer(), loss=D_loss)
  return discriminator

def get_gan(discriminator, generator):
  discriminator.trainable = False
  gan_input = tf.keras.Input(shape=(noise_dim+c_dim, ))
  gan_output = discriminator(generator(gan_input))
  gan = tf.keras.Model(inputs=gan_input, outputs=gan_output)
  gan.compile(optimizer=get_optimizer(), loss=Q_loss)
  return gan

generator = get_generator()
discriminator = get_discriminator()
full_gan = get_gan(discriminator, generator)

在 infoGAN 中,判别器有一个损失函数(这里,实际的判别器输出被命名为“critic_output”),还有一个用于你在它之后连接的 Q 网络(这里是critic_output 层之后的 2 层)。

其中需要 G_loss 值,就像这里一样(开头链接的代码)

# Entropy of Q: lambda*L(G,Q)
q_H = tf.reduce_mean(lambd*tf.nn.sigmoid_cross_entropy_with_logits(logits = tf.nn.softmax(Qcx), 
                                                               labels = c_sim))
# infoGAN loss function: Loss = V(D,G) - lambda*L(G,Q)
q_loss = tf.abs((g_loss - q_H))

这是我不知道如何在 Keras 中实现的,我已经找到了如何有多个输出,这是我在鉴别器网络中所做的。它具有critic 输出(计算G_loss 所需的值)和Q 净输出。但是我将如何实现这个 q_loss?

我没有尝试过,但我知道 keras 的损失函数的包装函数需要额外的参数(示例):

def G_loss(lambd):
    def loss(y_true, y_pred):
      return lambd * tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=y_pred,
                                                            labels=y_true))
return loss

虽然我已经读过它仅适用于常量(超参数)。我如何给它 G_loss 函数的值?

0个回答
没有发现任何回复~