在花费了很多时间之后,我终于找到了如何在 keras/tensorflow 库中实现解决方案,以及之前对我的问题的有用答案。首先,如果我们想实现一个带有一些参数的服装 keras 损失函数并访问我们必须定义的输入:
def custom_loss(alpha):
def loss(data, y_pred):
y_true = tf.reshape(data[:, 0], (-1, 1))
input = tf.reshape(data[:, 1], (-1, 1))
diff = K.abs((y_true - y_pred) / K.clip(K.abs(y_true), K.epsilon(),
None))
return 100. * K.mean(diff, axis=-1) +
K.mean(alpha*tf.keras.activations.relu(input - y_pred))
在这里,我将输入填充到输出张量的右侧,然后在函数内部重新打包以访问输入。在这里,我使用平均绝对百分比误差作为基本损失函数,然后借助 alpha 参数作为正则化参数和 Relu 函数添加所需的条件。请注意在此函数中使用输入数据的右列,那么如果我们要构建神经网络模型,则必须使用以下代码。首先,我们很容易将输入填充到我们的输出中,如下所示:
output_train = np.append(y_train, x_train, axis =1)
output_valid = np.append(y_valid, x_valid, axis =1)
在编译函数中:
model.compile(loss = custom_loss(alpha=10000))
这里我使用 10000 作为 alpha,很明显可以根据情况进行更改。现在我们可以在我们的数据上拟合模型。但是当我们要加载保存的模型时还有另一个问题。如果我们要加载模型,我们必须使用以下代码
model = keras.models.load_model(model_save_address, custom_objects={'loss': custom_loss(10000)})
现在一切都很好,我们可以运行我们的模型并在我们的数据上轻松地训练和测试它。
注意:首先我感谢所有帮助我解决问题的人。我认为值得注意的是,在解决问题之前,尽管我的数据具有良好的性能且误差非常低的模型,但在 50% 的情况下,我的预期条件已经违反,这对我来说是个问题。但是在实施此解决方案后,只有 0.5% 的情况不会满足条件,我希望找到另一种解决方案来进一步减少它。