Python 为Keras逐个元素编写自定义损失函数

Python 为Keras逐个元素编写自定义损失函数,python,tensorflow,keras,Python,Tensorflow,Keras,我不熟悉机器学习、python和tensorflow。我习惯于C++或C语言中的代码,而且我很难使用TF.后端。 我试图为LSTM网络编写一个自定义损失函数,该函数试图预测时间序列的下一个元素是正还是负。我的代码很好地使用了二进制交叉熵损失函数。现在我想改进我的网络,使其具有一个损失函数,如果预测概率大于0.5,则增加下一个时间序列元素的值,如果prob小于或等于0.5,则减去它。 我试过这样的方法: def customLossFunction(y_true, y_pred): tem

我不熟悉机器学习、python和tensorflow。我习惯于C++或C语言中的代码,而且我很难使用TF.后端。 我试图为LSTM网络编写一个自定义损失函数,该函数试图预测时间序列的下一个元素是正还是负。我的代码很好地使用了二进制交叉熵损失函数。现在我想改进我的网络,使其具有一个损失函数,如果预测概率大于0.5,则增加下一个时间序列元素的值,如果prob小于或等于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吗?
非常感谢来自keras后端功能的,您可以使用功能
更大的

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=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 
现在,如果只有二维目标:

axis=0 -> batch or sample dimension (number of sequences)
axis=1 -> predictions for each sequence
如果您只是想对每个序列的所有内容求和,那么就不要使用axis参数

有关此功能的重要注意事项: 由于它只包含来自
yTrue
的值,因此无法反向传播以更改权重。这将导致“none values not supported”错误或类似的错误


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

您从中得到任何错误吗?你能编辑你的问题并把它们包括进去吗。我认为您可能需要考虑如何在没有循环的情况下完成这一操作,在一个操作中使用一个函数来处理预测数据的所有元素。def customLossFunction(y_true,y_pred):返回K.mean(K.sign(y_pred)*y_true,axis=-1)
轴信息很有用。我可以问一下你是不是有一个推荐人从这里得到这个?我过去曾遇到过一个问题,即试图让损失与时间分布/返回序列=真实结果一起工作。你可能也想在这里回答我的问题:张量
yTrue
yPred
的形状是你的
model.summary()
的输出形状,也是你目标的形状。如果您了解数据,您就了解轴。函数的描述是,我同意,现在您已经按照您在回答中所做的方式说明了轴参数是有意义的。文档中没有用LSTM序列清楚地说明它,我也没有想到你所描述的,这很有道理。我仍然有错误消息“尝试将“x”转换为张量,但失败。错误:不支持任何值。”。这是因为大+施法不可微吗?哦,当然!这个函数是不可微的(关于权重),因为它最终只取决于
yTrue
。该功能必须依赖于
yPred
。(此函数中没有
yPred
值,只有一个使用它们的条件,并且该条件是不可微的)。