Добавление промежуточного слоя к функции потерь в глубоких кера - PullRequest
0 голосов
/ 02 июня 2018

Я хочу использовать пользовательскую функцию потерь, используя промежуточные слои для DNN модели VAE в кератах.Я вызываю функцию модели, а затем добавляю потери в слои.

Ошибка:

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval

model компилируется, но вызывает ошибку во время обучения

#Below is the code which causes error
#this returns the models (en,de, model) and layers (z_mean and #z_log_sigma)
en,de,model,z_mean,z_log_sigma = load_model(config)
#defining loss using intermediate layers returned
kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - 
                      K.exp(z_log_sigma), axis=-1)

model.add_loss(kl_loss)
model.compile( optimizer=optimizer)
#error is raised during training 
history = model.fit_generator(
                    genfun,
                    steps_per_epoch = display_interval,
                    epochs = 1,
                    shuffle=False,
                    verbose = 1
                ) #callbacks=[eval_map])    

1 Ответ

0 голосов
/ 08 июня 2018

Это решение работало для разработки пользовательского слоя потерь.

en,de,model,z_mean,z_log_sigma = load_model(config)

def custom_loss_wrapper(z_mean=z_mean,z_log_sigma=z_log_sigma):
    def loss(y_true, y_pred):
        xent_loss = binary_crossentropy(y_true, y_pred)
        kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - 
                    K.exp(z_log_sigma), axis=-1)
        return  xent_loss+kl_loss
    return loss
model.compile( 
optimizer=optimizer,loss=custom_loss_wrapper(z_mean,z_log_sigma))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...