Меня смущает потеря в кератах при использовании '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()