Keras 自定义损失函数:tf.function-装饰中的 ValueError

Keras custom loss function: ValueError in a tf.function-decorated

我正在尝试在 TF 2.2 中实现来自 this paper (an existing version in TensorFlow 1.10.1, made by the author of the paper can be found 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 时应该存在问题(无论如何推荐以加快计算速度),但我没有添加它.. .

这样试试

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)