создание GAN с эффективным использованием памяти в keras: `clear_session`, приводящий к конфликту тензорных графов - PullRequest
0 голосов
/ 07 февраля 2019

Я написал код для общей состязательной сети, которая будет работать в течение 4000 эпох, однако после 2000 эпох - время компиляции модели и использование памяти становятся очень неэффективными, и код выполняется крайне медленно.Я хотел бы сделать мой код эффективным для памяти.

На основе следующих двух постов.Я считаю, что ответом является использование clear_session в конце каждой эпохи:

https://github.com/keras-team/keras/issues/2828

https://github.com/keras-team/keras/issues/6457

Но если я использую clear_session вКонец каждой эпохи, мне нужно сохранить и веса дискриминатора и генератора на диск, прежде чем сделать это.Эта стратегия работает только для первой эпохи - после этого я продолжаю получать ошибку ValueError: Tensor("training_1/Adam/Const:0", shape=(), dtype=float32) must be from the same graph as Tensor("sub:0", shape=(), dtype=float32)., вызванную остановкой и перезапуском установленного графа тензорного потока.Я также получаю сообщение об ошибке Cannot interpret feed_dict key as Tensor: Tensor Tensor("conv1d_1_input:0", shape=(?, 750, 1), dtype=float32) is not an element of this graph.

from keras.backend import clear_session
discriminator=load_model('discriminator')
discriminator.trainable = False
gen_loss=[]
dis_loss=[]
epochs=4000
batch_size=100
save_interval=100
valid = np.ones((batch_size, 1))
fake = np.zeros((batch_size, 1))
for epoch in range(epochs):
    idx = np.random.randint(0, train_X.shape[0], batch_size)
    imgs = train_X[idx]
    # Sample noise and generate a batch of new images
    noise = np.random.normal(0, 1, (batch_size, int(train_X.shape[1]/4)))
    noise=noise.reshape(noise.shape[0], noise.shape[1],1)
    generator=load_model('9_heterochromatin','generator','1000')
    gen_imgs = generator.predict(noise)
    combined=add_layers(generator,discriminator,len(discriminator.layers))
    combined.compile(loss='binary_crossentropy', optimizer=optimizer)
    # Train the discriminator (real classified as ones and generated as zeros)
    d_loss_real = discriminator.train_on_batch(imgs, valid)
    d_loss_fake = discriminator.train_on_batch(gen_imgs, fake)
    d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
    # Train the generator (wants discriminator to mistake images as real)
    g_loss = combined.train_on_batch(noise, valid)
    generator=add_layers(Sequential(),combined,first_half_length)
    save_model(generator,'9_heterochromatin','generator','1000')
    gen_loss.append(g_loss)
    dis_loss.append(d_loss[0])
    # Plot the progress
    print ("%d [D loss: %f, acc.: %.2f%%] [G loss: %f]" % (epoch, d_loss[0], 100*d_loss[1], g_loss))
    # If at save interval => save generated image samples
    if epoch % save_interval == 0:
        save_imgs(epoch,gen_loss,dis_loss)
    K.clear_session()

Я пытаюсь создать эффективную память GAN, которая работает на основе сохранения и перезагрузки полученных весов в каждой эпохе, сопровождаемой при использовании clear_session для предотвращения памятиутечки.Кто-нибудь знает, как этого добиться, не имея конфликтных тензорных графиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...