为Keras

时间:2017-11-22 08:58:08

标签: python tensorflow keras

我是机器学习,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帮助我吗? 非常感谢

1 个答案:

答案 0 :(得分:3)

从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的值,因此无法反向传播以更改权重。这将导致不支持" none值"错误或类似的东西。

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