Как потери работают исключительно в кератах при использовании train_on_batch? - PullRequest
1 голос
/ 04 июня 2019

Меня смущает потеря в кератах при использовании 'train_on_batch'. Смотрите мою модель ниже (реализация триплета) Иногда моя модель выдает Nan, а потеря все равно показывает что-то вроде 0,4. И после некоторых итераций кодировщик всегда показывает один и тот же вывод независимо от того, что является вводом. И в этой ситуации потеря триплетной модели должна составлять 0,5 (см. Функцию bpr_triplet_loss ниже), но keras сообщает, что потеря составляет что-то вроде 0,1 или 0,2, даже иногда больше 1 или меньше 0. Почему? Это происходит из-за того, что возникает проблема взрыва градиента, а затем модель разрушается?

    ter_input = Input(shape=self.img_shape)
    ter_input_pos = Input(shape=self.img_shape)
    ter_input_neg = Input(shape=self.img_shape)

    ed = self.encoder()
    ter_encoded = ed(ter_input)
    pos_encoded = ed(ter_input_pos)
    neg_encoded = ed(ter_input_neg)

    def bpr_triplet_loss(X):
        positive_item_latent, negative_item_latent, user_latent = X
        # BPR loss
        loss = 1.0 - K.sigmoid(
            K.sum(user_latent * positive_item_latent, axis=-1, keepdims=True) -
            K.sum(user_latent * negative_item_latent, axis=-1, keepdims=True))
        return loss

    loss_layer = Lambda(bpr_triplet_loss, output_shape=(1,))([pos_encoded, neg_encoded, ter_encoded])

    def identity_loss(y_true, y_pred):
        return K.mean(y_pred - 0 * y_true)

    self.triplet_net = Model(
        input=[ter_input, ter_input_pos, ter_input_neg],
        output=loss_layer)
    self.triplet_net.compile(loss=identity_loss, optimizer=Adam(0.0001, beta_1=0, beta_2=0.99, decay=0.00001))  # Adam()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...