我正在尝试为Keras创建一个自定义损失函数以供使用,但遇到了一些麻烦。在此发布之后:Custom loss function in Keras我知道创建函数的语法,但是我不熟悉如何使用张量。 我用标量填充了yTrue,而yPred是实际的预测值。我想对预测值的对数进行加权总和,并按yTrue中的标量加权。当我做这样的事情时:
def customLoss(yTrue,yPred):
L = 0
for i in range(len(yTrue)):
L += tf.math.scalar_mul(yTrue[i], K.log(yPred[i]))
return L
当我尝试使用自定义损失函数编译模型时,程序崩溃,因为在执行model.compile时似乎传递了一些张量并运行了损失函数。打印出yTrue和yPred,我得到Tensor("dense_4_target:0", shape=(?, ?), dtype=float32) Tensor("dense_4/Softmax:0", shape=(?, 4), dtype=float32)
这告诉我必须使自定义损失函数与张量一起使用。
我尝试过return K.sum(K.prod(yTrue,K.log(yPred)))
,但得到
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py", line 1722, in reduce_prod
name=name))
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py", line 6239, in prod
name=name)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 610, in _apply_op_helper
param_name=input_name)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 60, in _SatisfiesTypeConstraint
", ".join(dtypes.as_dtype(x).name for x in allowed_list)))
我觉得不是很有帮助
答案 0 :(得分:0)
我想出了办法。我传递给model.fit(x = states,y = G),其中G是一个与yPred大小匹配的数组。这些是我放置标量值的地方。然后我的损失函数可能只是return K.sum(K.sum(yTrue*K.log(yPred)))