基于误差百分比的Keras自定义加权均方误差损失函数

2024-04-26 09:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

一般来说,我对Keras和神经网络还不熟悉。我正在尝试实现一个基于均方误差的自定义损失函数,用于异常检测的多层自动编码器。基本上我要的方法是从这里https://www.jstage.jst.go.jp/article/ipsjjip/27/0/27_335/_pdf

不幸的是,我没有声誉张贴图像,因为我也是新手,但公式是在第2页,第3节作为Lprop

这里的直觉是,我不希望自动编码器更新数据点的权重,这些数据点返回的错误超过了损失的ap百分位数。通过这种方式,它学会了在处理异常值的同时重构数据集中的内联线,从而将它们检测为异常。在

下面是我尝试过的一些代码和编译后的模型

import keras.backend as K
c = 70.0
    def mean_squared_errorx(y_true, y_pred):
        es = K.square(y_pred - y_true)
        const = np.percentile(es, c)
        w = K.cast(K.less(const, K.mean(K.square(y_pred - y_true), axis=-1)), dtype = "float32")
        return w * K.mean(K.square(y_pred - y_true), axis=-1)

    #'mean_squared_error'
    autoencoder.compile(optimizer=adam, loss=mean_squared_errorx)
    autoencoder.fit(train, train,
                    epochs=num_epochs,
                    batch_size=round(len(train)/50),
                    shuffle=True,
                    validation_data=(train, train),
                    verbose = 0)
    encoded_d = encoder.predict(train)
    decoded_pred = decoder.predict(encoded_d)

其思想是让K.less为每个错误返回一个bool,然后将其转换为float,作为return语句中的权重。 我知道百分位部分可能不适用于张量,但不知道如何完成百分位排名。在

有了这个代码,我得到了这个错误信息

^{pr2}$

在这种情况下,批量大小为37,特征数量为21。我很感谢你对代码的这一部分或其他部分的任何反馈-谢谢!在


Tags: 数据代码truees错误train编码器mean
1条回答
网友
1楼 · 发布于 2024-04-26 09:28:17

找到了一个潜在的解决办法,如果有人在做类似的事情

import keras.backend as K
    def mean_squared_error_w(y_true, y_pred):
        mses = K.mean(K.square(y_pred - y_true), axis = -1)
        std_of_mses = K.std(mses)
        const = K.mean(mses, axis = -1) + (std_of_mses * 0.5)
        mask = K.cast(K.less(K.mean(K.square(y_pred - y_true), axis=-1), const), dtype = "float32")
        return mask * K.mean(K.square(y_pred - y_true), axis=-1)

我相信这将为所有出错的值创建一个bool张量 大于一个阈值,由批处理MSE加上半个标准偏差的平均值定义(如果误差是正态分布的,则应对应数据的第70个百分位作为截止值)。它将bools转换为权重0或1作为掩码,然后应用于输出MSE损失

相关问题 更多 >