Модель keras запрашивает компиляцию после загрузки модели с помощью load_model - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь сохранить свои модели GAN. Я не нашел много информации об inte rnet и очень запутался в том, как сохранять - генератор, дискриминатор и GAN. Вот проблема , которую я обнаружил и закодировал соответствующим образом. Но даже после сохранения и загрузки моделей таким образом я получаю сообщение об ошибке You must compile a model before training/testing. Обратите внимание, что они попросили использовать tensorflow.keras, а не keras, но я этого не понял.

Как сохранить и загрузить GAN, чтобы можно было намеренно прерывать работу клавиатуры между эпохами и запускать снова позже?

Функция для сохранения моделей GAN:

def save_model_to_file(gan, generator, discriminator, epoch):
    discriminator.trainable = False
    gan.save('facegan-gannet-epoch:%02d.h5' % epoch)
    discriminator.trainable = True
    generator.save('facegan-generator-epoch:%02d.h5' % epoch)
    discriminator.save('facegan-discriminator-epoch:%02d.h5' % epoch)

Загрузили модели следующим образом: (Все найденные параметры можно обучить)

discriminator = load_model(models_paths["discriminator"])
discriminator.trainable = False
generator = load_model(models_paths["generator"])
gan = load_model(models_paths["gan"])
gan.summary()
discriminator.summary()
generator.summary()

Основная часть поезда:

    generator = get_generator()
    discriminator = get_discriminator()
    gan = get_gan_network(discriminator, LATENT_DIM, generator, optimizer)

    for epoch in range(1, epochs + 1):
        print('\n', '\t' * 3, '-' * 4, 'Epoch %d' % epoch, '-' * 4)

        for batch_count, image_batch in tqdm(enumerate(datagen)):

            if batch_count == len(datagen):  # len(datagen)
                break

            # Get a random set of input noise and images
            noise = np.random.normal(0, 1, size=[BATCH_SIZE, LATENT_DIM])

            # Generate fake images
            generated_images = generator.predict(noise)
            X = np.concatenate([image_batch, generated_images])

            # Labels for generated and real data
            y_dis = np.zeros(2 * BATCH_SIZE)
            # One-sided label smoothing
            y_dis[:BATCH_SIZE] = 0.9

            # Train discriminator
            discriminator.trainable = True
            discriminator_loss = discriminator.train_on_batch(X, y_dis)

            # Train generator
            noise = np.random.normal(0, 1, size=[BATCH_SIZE, LATENT_DIM])
            y_gen = np.ones(BATCH_SIZE)
            discriminator.trainable = False
            gannet_loss = gan.train_on_batch(noise, y_gen)

        save_model_to_file(gan, generator, discriminator, epoch)

Полное сообщение об ошибке:

RuntimeError
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-29-740ccd719c22> in <module>
    245 
    246 print("[INFO] Training started...")
--> 247 train(3, BATCH_SIZE, model_paths)
    248 print("[INFO] Training completed.")

<ipython-input-29-740ccd719c22> in train(epochs, batch_size, models_paths)
    225             # Train discriminator
    226             discriminator.trainable = True
--> 227             discriminator_loss = discriminator.train_on_batch(X, y_dis)
    228 
    229             # Train generator

/opt/conda/lib/python3.7/site-packages/keras/engine/training.py in train_on_batch(self, x, y, sample_weight, class_weight, reset_metrics)
   1506             x, y,
   1507             sample_weight=sample_weight,
-> 1508             class_weight=class_weight)
   1509         if self._uses_dynamic_learning_phase():
   1510             ins = x + y + sample_weights + [1]

/opt/conda/lib/python3.7/site-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    506         if y is not None:
    507             if not self.optimizer:
--> 508                 raise RuntimeError('You must compile a model before '
    509                                    'training/testing. '
    510                                    'Use `model.compile(optimizer, loss)`.')

RuntimeError: You must compile a model before training/testing. Use `model.compile(optimizer, loss)`.
You must compile a model before training/testing. Use `model.compile(optimizer, loss)`.

1 Ответ

0 голосов
/ 20 июня 2020

Если вы хотите сохранить и продолжить позже, я рекомендую вместо этого использовать save_weights и load_weights, что означает, что вы создаете модель и всегда компилируете ее, а затем проверяете, есть ли файл весов, если такой файл есть, загрузите веса из него.

Примерно так:

import os
g_file_name = 'your generator.h5'
d_file_name = 'your descriminator.h5'
(generator, descriminator) = create_your_models()
compile_your_models(generator, descriminator)
if os.path.isfile(g_file_name):
    generator.load_weights(g_file_name)
if os.path.isfile(d_file_name):
    descriminator.load_weights(d_file_name)

for epoch in range(num_epochs):
    gan_training()
    generator.save_weights(g_file_name)
    descriminator.save_weights(g_file_name)
...