gpt4 book ai didi

tensorflow - 自定义损失函数 Keras Tensorflow

转载 作者:行者123 更新时间:2023-12-02 06:50:41 28 4
gpt4 key购买 nike

我需要一个自定义加权 MSE 损失函数。我在 keras.backend 中定义的

from keras import backend as K
def weighted_loss(y_true, y_pred):
return K.mean( K.square(y_pred - y_true) *
K.exp(-K.log(1.7) * (K.log(1. + K.exp((y_true - 3)/5 ))))
,axis=-1 )

但是,测试运行返回

    weighted_loss(1,2)
ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("Exp_37:0", shape=(), dtype=float32)'

    weighted_loss(1.,2.)
ZeroDivisionError: integer division or modulo by zero

我想知道我在这里犯了什么错误。

最佳答案

您使用的是 Tensorflow 还是 Theano 与您的问题无关。如果术语让您感到困惑,请搜索“张量”的含义。

看看 Keras 自己的损失函数测试是如何实现的 here :

def test_metrics():
y_a = K.variable(np.random.random((6, 7)))
y_b = K.variable(np.random.random((6, 7)))
for metric in all_metrics:
output = metric(y_a, y_b)
print(metric.__name__)
assert K.eval(output).shape == (6,)

您不能简单地将 float 或 int 输入到张量计算中。还要注意使用 K.eval 来获得您正在寻找的结果。

所以用你的函数试试类似的东西:

from keras import backend as K
import numpy as np

y_a = K.variable(np.random.random((6, 7)))
y_b = K.variable(np.random.random((6, 7)))
output = weighted_loss(y_a,y_b)
result = K.eval(output)

也无需在 keras.backend 中定义您的自定义函数 - 如果您决定稍后更新 Keras 怎么办?

您可以在自己的代码中执行以下操作:定义一个返回损失函数的函数

def weighted_loss(y_true, y_pred):
return K.mean( K.square(y_pred - y_true) * K.exp(-K.log(1.7) * (K.log(1. + K.exp((y_true - 3)/5 )))),axis=-1 )

然后当你想用你的损失函数编译你的模型时,你可以这样做:

model.compile(loss = weighted_loss)

如果您想定义更通用的损失函数,其中权重取决于某些输入,您需要包装该函数。比如:

def get_weighted_loss(my_input):
def weighted_loss(y_true, y_pred):
return K.mean( K.square(y_pred - y_true) * K.exp(-K.log(1.7) * (K.log(1. + K.exp((y_true - 3)/my_input )))),axis=-1 )
return weighted_loss

然后当你想用你的损失函数编译你的模型时,你可以这样做:

model.compile(loss = get_weighted_loss(5))

关于tensorflow - 自定义损失函数 Keras Tensorflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45279085/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com