对神经网络施加条件

机器算法验证 神经网络 张量流 喀拉斯
2022-03-22 03:07:34

我正在 python 中使用 TensorFlow 和 Keras 构建神经网络模型。我的模型以我想要的方式在看不见的数据上表现良好,一切都很好。但我不知道如何实现解决方案的问题是:考虑我的神经网络有这样的输入

Input = [i1, i2, i3, i4, i5]

并且网络的输出只有单个值,我们称之为

Output = O

我希望神经网络的输出大于特定的输入值。例如,我想要O > i3尽管我的神经网络在测试数据(看不见的数据)上的表现非常好,但在某些情况下会违反上述条件,这对我来说是个问题。

3个回答

一个非常简单的解决方案是添加一个正则化项,因此您的损失函数是每当您的不等式被违反时,这都会增加惩罚,因此模型将倾向于尊重约束。loss+λReLU(i3O)

虽然这个解决方案不精确,但准确地解决这个问题将更具挑战性,因为约束优化不是 NN 库的设计目标。

一些相关的解决方案:

机器学习中的损失函数——如何约束?

您可以让输出不受约束,然后通过执行之类的操作进行后处理吗?您甚至可以将其直接放入损失函数中。O+i3

在花费了很多时间之后,我终于找到了如何在 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% 的情况不会满足条件,我希望找到另一种解决方案来进一步减少它。