我提出了以下简单的自定义损失函数:
def my_loss_function(y_true, y_pred):
#diff = y_pred[1:,:] - y_pred[:-1, :] //previous implementation, same problem
indx1 = tf.range(1, 128)
indx2 = tf.range(0, 127)
diff = tf.gather(y_pred, indx1) - tf.gather(y_pred, indx2)
order_loss = -K.sum(K.log(K.sigmoid(diff)+K.epsilon()))
return order_loss
如您所见,我实际上不需要y-true数据,因此我生成了一个伪y_true数据只是为了避免keras的检查错误。
我现在遇到的一个奇怪的问题是,即使我将return更改为2*order_loss
或将K.sum
更改为K.mean
时,该损失函数始终以几乎相同的值开始运行或其他功能。在训练中,损失会非常缓慢地减少,并且会很快达到平稳状态。我想不出任何可能导致此问题的原因,是否有人有类似的经验或知道如何解决此问题?
更新:
即使我将损失函数更改为:
def my_loss_function(y_true, y_pred):
diff = alpha*y_pred # alpha is a constant
order_loss = -K.sum(K.log(K.sigmoid(diff)+K.epsilon()))
return order_loss
它仍然存在相同的问题,当我更改alpha值时,输出不会相应地更改。 y_pred的int_shape为(none,1)。
答案 0 :(得分:0)
如果不完全解决问题,很难回答您的问题,但是我建议您在损失函数中进行一些调试。这是一个示例,说明如何打印一些东西并查看其中的实际内容。
def my_loss_function(y_true, y_pred):
diff = y_pred[1:,:] - y_pred[:-1, :]
order_loss = -K.sum(K.log(K.sigmoid(diff)+K.epsilon()))
# anything you like to print
print_op = tf.print("\nDebug : ", diff, order_loss, K.get_variable_shape(y_pred))
with tf.control_dependencies([print_op]): # this will force the print_op to be run
return K.identity(order_loss)
#return K.identity(order_loss)
我希望这对您查看形状和值是否符合预期以及是否存在差异有帮助。 如果您发现任何可疑的东西,请告诉我,然后我们可以继续进行。