Реализация состязательной потери в Керасе - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь реализовать состязательный проигрыш в керасе. Модель состоит из двух сетей: одного автокодера (целевая модель) и одного дискриминатора. Две модели имеют общий кодировщик.

Я создал состязательную потерю авто-кодера, установив переменную keras

def get_adv_loss(d_loss):
    def loss(y_true, y_pred):
        return some_loss(y_true, y_pred) - d_loss
    return loss

discriminator_loss = K.variable()
L = get_adv_loss(discriminator_loss)
autoencoder.compile(..., loss=L)

и во время обучения я чередую train_on_batch из discriminator и autoencoder, чтобы обновить discriminator_loss

d_loss = disciminator.train_on_batch(x, y_domain)
discriminator_loss.assign(d_loss)
a_loss, ... = self.segmenter.train_on_batch(x, y_target)

Однако я обнаружил, что значение этих переменных замораживается при компиляции модели. Я пытался перекомпилировать модель во время тренировки, но это вызывает ошибку

Узел 'IsVariableInitialized_13644': неизвестный входной узел 'Training_12 / Adam / Variable'

что, по-моему, означает, что я не могу перекомпилировать во время тренировки? Любое предложение о том, как я могу ввести потери дискриминатора в автоэнкодере?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Если вы не решите углубиться в исходный код keras, я не думаю, что вы можете сделать это легко. Прежде чем писать свой собственный состязательный модуль, вы должны тщательно проверить существующие работы. Насколько я знаю, keras-adversarial все еще используется многими людьми. Конечно, он поддерживает только старые версии keras, например 2.0.8.

Несколько других вещей:

  1. будьте осторожны, когда вы замораживаете вес модели. Если вы сначала скомпилируете модель, а затем заморозите некоторые весовые коэффициенты, эти весовые коэффициенты все еще будут доступны для обучения, потому что, когда функция поезда генерируется во время компиляции. Таким образом, вы должны сначала заморозить веса, а затем скомпилировать.
  2. keras-adversarial делает эту работу более элегантно. Вместо того чтобы делать две модели, разделять веса, но по-разному фиксировать некоторые веса, он создает две функции поезда, по одной для каждого игрока.
0 голосов
/ 28 августа 2018

Модель Keras поддерживает несколько выходов. Так что просто включите ваш дискриминатор в вашу модель keras и заморозьте слои дискриминатора, если дискриминатор не нужно обучать.

Следующий вопрос заключается в том, как объединить потерю автоэнкодера и потерю дискриминатора. К счастью, keras model.compile поддерживает веса потерь. Если autoencoder - ваш первый выход, а дискриминатор - второй, вы можете сделать что-то вроде loss_weights=[1, -1]. Так что лучший дискриминатор хуже для автоэнкодера.

Изменить: Вот пример, как реализовать сеть противника:

# Build your architecture
auto_encoder_input = Input((5,))
auto_encoder_net = Dense(10)(auto_encoder_input)
auto_encoder_output = Dense(5)(auto_encoder_net)

discriminator_net = Dense(20)(auto_encoder_output)
discriminator_output = Dense(5)(discriminator_net)

# Define outputs of your model
train_autoencoder_model = Model(auto_encoder_input, [auto_encoder_output, discriminator_output])
train_discriminator_model = Model(auto_encoder_input, discriminator_output)

# Compile the models (compile the first model and then change the trainable attribute for the second)
for layer_index, layer in enumerate(train_autoencoder_model.layers):
    layer.trainable = layer_index < 3

train_autoencoder_model.compile('Adam', loss=['mse', 'mse'], loss_weights=[1, -1])        

for layer_index, layer in enumerate(train_discriminator_model.layers):
    layer.trainable = layer_index >= 3

train_discriminator_model.compile('Adam', loss='mse')

# A simple example how a training can look like
for i in range(10):
    auto_input = np.random.sample((10,5))
    discrimi_output = np.random.sample((10,5))
    train_discriminator_model.fit(auto_input, discrimi_output, steps_per_epoch=5, epochs=1)
    train_autoencoder_model.fit(auto_input, [auto_input, discrimi_output], steps_per_epoch=1, epochs=1)  

Как видите, за созданием модели противника с помощью керас не так много магии.

...