Стремительное выполнение Tensorflow - вложенная градиентная лента - PullRequest
0 голосов
/ 29 октября 2018

Я тестировал свой алгоритм WGAN-GP на TensorFlow, используя традиционную реализацию графа. Недавно мне довелось познакомиться с TensorFlow Eager Execution и я попытался преобразовать мой код для работы в режиме активного исполнения.

Позвольте мне сначала показать вам предыдущий код:

self.x_ = self.g_net(self.z)
self.d  = self.d_net(self.x, reuse=False)
self.d_ = self.d_net(self.x_)

self.d_loss = tf.reduce_mean(self.d) - tf.reduce_mean(self.d_)

epsilon = tf.random_uniform([], 0.0, 1.0)

x_hat = epsilon * self.x + (1 - epsilon) * self.x_
d_hat = self.d_net(x_hat)

ddx = tf.gradients(d_hat, x_hat)[0]
ddx = tf.sqrt(tf.reduce_sum(tf.square(ddx), axis=1))
ddx = tf.reduce_mean(tf.square(ddx - 1.0) * scale)

self.d_loss = self.d_loss + ddx

self.d_adam = tf.train.AdamOptimizer().minimize(self.d_loss, var_list=self.d_net.vars)

Затем он преобразуется в:

self.x_ = self.g_net(self.z)

epsilon = tf.random_uniform([], 0.0, 1.0)

x_hat = epsilon * self.x + (1 - epsilon) * self.x_

with tf.GradientTape(persistent=True) as temp_tape:
    temp_tape.watch(x_hat)
    d_hat = self.d_net(x_hat)

ddx = temp_tape.gradient(d_hat, x_hat)[0]
ddx = tf.sqrt(tf.reduce_sum(tf.square(ddx), axis=1))
ddx = tf.reduce_mean(tf.square(ddx - 1.0) * 10)

with tf.GradientTape() as d_tape:
    d  = self.d_net(x)
    d_ = self.d_net(x_)

    loss_d = tf.reduce_mean(d) - tf.reduce_mean(d_) + ddx

grad_d = d_tape.gradient(loss_d, self.d_net.variables)

self.d_adam.apply_gradients(zip(grad_d, self.d_net.variables))

Я пробовал несколько альтернативных способов реализовать потерю WGAN-GP, но в любом случае d_loss расходится! Я надеюсь, что есть кто-то, кто мог бы просветить меня, указав на мои ошибки.

Кроме того, мне интересно, смогу ли я использовать слои Keras с моей предыдущей реализацией потерь и оптимизатором. Заранее спасибо!

...