我自己以损失函数编写的损失函数的异常行为(总是输出相似的值)

时间:2019-05-07 20:21:03

标签: tensorflow keras

我正在实现基于CNN的深度学习算法,以提供一组图像的连续排名。我的计划是为网络提供一批已经按正确顺序排名的图像,并评估自定义损失函数中的排名错误,希望网络能够学习如何产生相对数字以指示给定图像的位置按顺序。

我提出了以下简单的自定义损失函数:

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)。


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)

我希望这对您查看形状和值是否符合预期以及是否存在差异有帮助。 如果您发现任何可疑的东西,请告诉我,然后我们可以继续进行。