Сеть GAN Disc.убыток уменьшается, а генерал увеличивается, а не уменьшается - PullRequest
0 голосов
/ 17 мая 2018

Моя сеть RNN Gan, которая состоит из двух сетей RNN, генератора и дискриминатора для генерации звука. Но он делает полную противоположность тому, что он делает, это действительно странно. Потери дискриминатора уменьшаются, а потери генератора увеличиваются, поэтому он делает полную противоположность тому, что должен делать. Но это становится еще более странным, потому что потери на самом деле являются линейными в десятичном / прямом выражении, просто если они должны были это сделать, но, очевидно, это не так. Итак, чем может быть вызвано такое поведение? Я что-то поменял?

Потери: https://pastebin.com/78BmS8iK

Дискриминатор / код генератора:

def build_audio_generator(frame_size):
model = Sequential()
model.add(LSTM(512, input_shape=(frame_size, 1), return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(512, return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(512))
model.add(Dense(256))
model.add(Dropout(0.3))
model.add(Dense(256*frame_size))
model.add(Activation('softmax'))
model.add(Reshape((frame_size, 256)))

model.summary()

noise = Input(shape=(frame_size, 1))

sound = model(noise)

return Model(noise, sound)

def build_audio_discriminator(audio_shape):
model = Sequential()
model.add(Conv1D(32, kernel_size=(2), padding="same", input_shape=audio_shape))
model.add(MaxPooling1D(pool_size=(2)))
model.add(Dropout(0.25))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(128))

model.summary()

audio = Input(shape=audio_shape)

# Extract feature representation
features = model(audio)

# Determine validity and label of the audio
validity = Dense(1, activation="sigmoid")(features)

return Model(audio, validity)

Основной (объединяющий обе модели):

    frame_size = 500
    frame_shift = 128

    num_classes = 1

    audio_shape_disc = (frame_size,256)

    optimizer = Adam(0.0002, 0.5)
    losses = ['binary_crossentropy']

    # Build and compile the discriminator
    audio_discriminator = build_audio_discriminator(audio_shape_disc)
    audio_discriminator.compile(loss=losses, optimizer=optimizer, metrics=['accuracy'])

    # Build the generator
    audio_generator = build_audio_generator(frame_size)

    # The generator takes noise
    noise = Input(shape=(frame_size, 1))

    audio = audio_generator(noise)

    # For the combined model we will only train the generator
    audio_discriminator.trainable = False

    # The discriminator takes generated audio as input and determines validity
    audio_valid = audio_discriminator(audio)

    # The combined model  (stacked generator and discriminator) takes
    # noise as input => generates audio => determines validity
    audio_combined = Model(noise, audio_valid)
    audio_combined.compile(loss=losses, optimizer=optimizer)

    train(audio_generator, audio_discriminator, audio_combined, epochs, frame_size, frame_shift)

Обучение (функция train () сокращена):

      for s in range(0, Y.shape[1], frame_size):

            audio = Y
            epoch_counter += 1


            if epoch_counter>epochs: break;

            audio_frame = audio[:, s:s+500, :]
            if audio_frame.shape[1]<frame_size: break;

            noise = np.random.normal(0, 1, (1, frame_size, 1))


            # Generate a half batch of new images
            gen_audio = generator.predict(noise)

            valid = np.ones((1, int(frame_size/2), 1))

            fake = np.zeros((1, int(frame_size/2), 1))


            # Train the discriminator
            d_loss_real = discriminator.train_on_batch(audio_frame, valid)
            d_loss_fake = discriminator.train_on_batch(gen_audio, fake)
            d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

            # Train the generator
            g_loss = combined.train_on_batch(noise, valid)

            # Plot the progress
            print(str(epoch_counter) + '/' + str(epochs) + ' > Discriminator loss: ' + str(d_loss[0]) + ' | Generator loss: ' +  str(g_loss))
...