我对使用“ 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()