【问题标题】:Keras custom loss function: ValueError in a tf.function-decoratedKeras 自定义损失函数:tf.function-decorated 中的 ValueError
【发布时间】:2020-10-14 11:32:10
【问题描述】:

我正在尝试在 TF 2.2 中实现来自 this paper 的损失函数(TensorFlow 1.10.1 中的现有版本,由论文作者制作,可以在 here 找到)。

但是,损失函数的理论细节与我的问题无关。

我的损失函数:

def z_score_based_deviation_loss(y_true, y_pred):
    confidence_margin = 5.0     
    ref = K.variable(np.random.normal(loc=0., scale=1.0, size=5000), dtype='float32')
    dev = (y_pred - K.mean(ref)) / K.std(ref)
    inlier_loss = K.abs(dev) 
    outlier_loss = K.abs(K.maximum(confidence_margin - dev, 0.))
    return K.mean((1 - y_true) * inlier_loss + y_true * outlier_loss)

调用方式:

model.compile(optimizer='adam', loss=z_score_based_deviation_loss)

我收到了这个错误:

ValueError: tf.function-decorated function tried to create variables on non-first call.

我知道关于这个主题还有其他问题,但我没有找到任何与 Keras 中的自定义损失函数相关的问题。 我不知道如何适应它。

另外,根据我的阅读,当函数被标记为@tf.function 时应该存在问题(无论如何建议加快计算速度),但我没有添加它......

【问题讨论】:

    标签: tensorflow keras loss-function valueerror tensorflow2.x


    【解决方案1】:

    这样试试

    def z_score_based_deviation_loss(y_true, y_pred):
        confidence_margin = 5.0     
        ref = tf.random.normal([5000], mean=0., stddev=1.)
        dev = (y_pred - K.mean(ref)) / K.std(ref)
        inlier_loss = K.abs(dev) 
        outlier_loss = K.abs(K.maximum(confidence_margin - dev, 0.))
        return K.mean((1 - y_true) * inlier_loss + y_true * outlier_loss)
    
    
    X = np.random.uniform(0,1, (100,10))
    y = np.random.uniform(0,1, 100)
    
    x_input = Input((10,))
    intermediate = Dense(1, activation='linear',  name = 'score')(x_input)
    model = Model(x_input, intermediate)
    
    model.compile('adam', z_score_based_deviation_loss)
    model.fit(X, y, epochs=10)
    

    【讨论】:

    • 它有效,谢谢!能否请您解释一下为什么问题只出在K.vairable的生成中?
    • 问题只出在K.vairable中...一般来说,在loss中使用变量似乎没有多大意义而且看起来很棘手,使用一个简单的随机生成器,在这种情况下,是足够的。这种行为在 tf2 中也被否认了。不要忘记投票并接受作为答案;-)
    猜你喜欢
    • 2020-12-24
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2017-12-29
    • 2018-11-12
    相关资源
    最近更新 更多