Я построил модель глубокого обучения типа кодер-декодер с помощью TensorFlow2.0, и по определенной причине кодер и декодер являются двумя отдельными моделями, и я хотел бы оптимизировать эти две модели с помощью функции optimizer.apply_gradients(). Документ TensorFlow не предоставил слишком много информации для этого случая. Он показывает, что grads_and_vars должно быть "Список пар (градиент, переменная)". Я попробовал два метода, как показано ниже:

1-й метод: optimizer.apply_gradients(zip(grads, self._encoder.trainable_weights, self._decoder.trainable_weights))

2-й метод: optimizer.apply_gradients([zip(grads, self._encoder.trainable_weights), zip(grads, self._decoder.trainable_weights)])

.

и ни то, ни другое не работает. Какой способ является правильным?

Ответы (1)

Вы можете попробовать цикл обучения, подобный следующему коду, взятому из учебникаDCGAN.

with tf.GradientTape() as enc_tape, tf.GradientTape() as dec_tape:
    feature_space = encoder(images, training=True)
    восстановленное_изображение = декодер(feature_space, training=True)

    #Некоторая пользовательская функция потерь...
    loss = tf.keras.losses.MSE(recovered_image, images)

    gradients_of_encoder = enc_tape.gradient(loss , encoder.trainable_variables)
    gradients_of_decoder = dec_tape.gradient(loss, decoder.trainable_variables)

enc_optimizer.apply_gradients(zip(gradients_of_encoder , encoder.trainable_variables))
dec_optimizer.apply_gradients(zip(gradients_of_decoder , decoder.trainable_variables))

2022 WebDevInsider