【问题标题】:Writing a custom loss function element by element for Keras为 Keras 逐个元素地编写自定义损失函数
【发布时间】:2018-05-05 22:33:57
【问题描述】:

我是机器学习、python 和 tensorflow 的新手。我习惯用 C++ 或 C# 编写代码,我很难使用 tf.backend。 我正在尝试为 LSTM 网络编写一个自定义损失函数,该函数试图预测时间序列的下一个元素是正数还是负数。我的代码使用 binary_crossentropy 损失函数运行良好。我现在想改进我的网络,它有一个损失函数,如果预测概率大于 0.5,则添加下一个时间序列元素的值,如果概率小于或等于 0.5,则减去它。 我尝试过这样的事情:

def customLossFunction(y_true, y_pred):
    temp = 0.0
    for i in range(0, len(y_true)):
        if(y_pred[i] > 0):
            temp += y_true[i]
        else:
            temp -= y_true[i]
    return temp

显然,维度是错误的,但由于我在调试时无法进入我的函数,因此很难在这里掌握维度。 你能告诉我是否可以使用逐个元素的功能吗?如果是,如何?如果没有,你能帮我处理 tf.backend 吗? 非常感谢

【问题讨论】:

  • 你有没有从中得到任何错误?您能否编辑您的问题并将其包括在内。我认为您可能需要考虑如何在没有 for 循环的情况下使用一个在单个操作中处理预测数据的所有元素的函数来做到这一点。
  • 使用来自tensorflow.org/api_guides/python/math_ops 的信息尝试来自keras import backend as K; def customLossFunction(y_true, y_pred): return K.mean(K.sign(y_pred) * y_true, axis=-1) 的信息

标签: python tensorflow keras


【解决方案1】:

从 keras 后端函数中,您可以使用函数 greater

import keras.backend as K

def customLossFunction(yTrue,yPred)

    greater = K.greater(yPred,0.5)
    greater = K.cast(greater,K.floatx()) #has zeros and ones
    multiply = (2*greater) - 1 #has -1 and 1

    modifiedTrue = multiply * yTrue

    #here, it's important to know which dimension you want to sum
    return K.sum(modifiedTrue, axis=?)

axis参数要根据你要求和的使用。

axis=0 -> batch or sample dimension (number of sequences)     
axis=1 -> time steps dimension (if you're using return_sequences = True until the end)     
axis=2 -> predictions for each step 

现在,如果您只有一个 2D 目标:

axis=0 -> batch or sample dimension (number of sequences)
axis=1 -> predictions for each sequence

如果您只是想对每个序列的所有内容求和,那么就不要输入轴参数。

关于此功能的重要说明:

因为它只包含来自yTrue 的值,所以它不能反向传播来改变权重。这将导致“不支持任何值”错误或非常类似的错误。

虽然在函数中使用了yPred(连接到模型权重的那个),但它仅用于获取真x假条件,这是不可微分的。

【讨论】:

  • 轴信息很有用。请问您是否有参考资料?过去,我在尝试使用 TimeDistributed / return_sequences=True 结果时遇到了一个问题。您可能也想在这里回答我的问题:stackoverflow.com/questions/45765136/…
  • 张量yTrueyPred 的形状是您的model.summary() 的输出形状,这也是您的目标的形状。如果你了解你的数据,你就会了解坐标轴。功能描述为here
  • 我同意,现在您已经按照您在回答中所做的方式说明了轴参数是有意义的。文档没有根据 LSTM 序列清楚地说明它,而且我没有对你描述的内容做出精神上的飞跃。
  • 这很有意义。我仍然收到错误消息“尝试将'x'转换为张量并失败。错误:不支持无值。”。是因为 Greater+cast 不可微吗?
  • 哦,当然!这个函数是不可微的(关于权重),因为它最终只依赖于yTrue。该函数必须依赖于yPred。 (这个函数中没有yPred的值,只有一个使用它们的条件,并且条件不可微)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2020-12-19
  • 2017-12-18
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
相关资源
最近更新 更多