我是机器学习,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帮助我吗? 非常感谢
答案 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假条件,这是不可微分的。