【问题标题】:Issue on custom loss function with Keras with TensorFlow backend带有 TensorFlow 后端的 Keras 的自定义损失函数问题
【发布时间】:2017-04-21 10:42:09
【问题描述】:

我正在尝试将三类分类问题的损失函数定义如下:

def func_loss(y_true, y_pred):
    return -K.mean(K.prod(K.cast(K.argmax(y_pred, axis=1), K.floatx()) - 1.0, K.cast(K.argmax(y_true, axis=1), K.floatx()) - 1.0))

我的y 看起来像这样: [[1,0,0], [0,1,0], [1,0,0], [0,0,1], ...]

直观地说,我的三类标签是“-1”、“0”和“+1”类的单热编码。我想最大化“+/-1”的正确标签,最小化“+/-1”的错误标签并忽略所有“0”标签,无论它们是否正确。

当我用这个损失函数编译模型时,我得到的是:

Traceback (most recent call last):
File "", line 1, in 
File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 547, in compile
**kwargs)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 622, in compile
sample_weight, mask)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 324, in weighted
score_array = fn(y_true, y_pred)
File "", line 2, in func_loss
File "/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py", line 464, in prod
axis = _normalize_axis(axis, ndim(x))
File "/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py", line 435, in _normalize_axis
if axis is not None and axis < 0:
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 547, in nonzero
raise TypeError("Using a tf.Tensor as a Python bool is not allowed. "
TypeError: Using a tf.Tensor as a Python bool is not allowed. Use if t is not None: instead of if t: to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.

我一直在尝试对这个损失函数进行一些小调整,但是当我编译模型时,所有这些都会导致一些错误。我想我可能对这件事的工作原理有一些基本的误解。有人可以帮忙吗?


编辑: 新的损失函数:

def func_loss(y_true, y_pred):
    return -K.mean((K.cast(K.argmax(y_pred, axis=1), K.floatx()) - 1.0 )* (K.cast(K.argmax(y_true, axis=1), K.floatx()) - 1.0))

【问题讨论】:

    标签: python machine-learning tensorflow deep-learning keras


    【解决方案1】:

    我也在 Tensorflow Github 上回复了你。

    您已经编辑了损失函数,但实际上您现在得到的错误略有不同。

    之前,错误发生在K.mean

    File "/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py", line 490, in mean
    axis = _normalize_axis(axis, ndim(x))
    

    现在,如您所见,它发生在K.prod

    File "/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py", line 464, in prod
    axis = _normalize_axis(axis, ndim(x))
    

    但是,原因仍然相同:K.meanK.prod 各取一个 Tensor,因此您传递的第二个 Tensor 被视为 axis 参数。

    【讨论】:

    • 感谢您指出这一点。我的意思是在K.argmax(y_true, axis=-1) - 1K.argmax(y_pred, axis=-1) - 1 之间进行逐元素乘法。你能回顾一下我的新损失函数吗?我可以用这个损失函数编译得很好,但它给了我ValueError: None values not supported
    • @TengyuLiu 你有没有找到解决方案。在成本函数中使用 K.argmax 时,我遇到了类似的错误,我相信问题是在我使用 K.argmax 时被隔离的。
    • @adalca 我不记得确切的解决方案,但我当时的错误之一是我的损失函数不可微。如果您确定您的错误与语法错误无关,这是一个值得关注的方向。
    • @TengyuLiu 谢谢,我想这也是我的问题——我可以计算指标,但由于差异化,不能将其用作损失。说得通。我用另一种可微分的方式近似了这一步。
    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 2018-12-26
    • 2018-08-06
    • 2018-10-28
    • 2017-12-29
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多