Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于误差百分比的Keras中自定义加权均方误差损失函数_Python_Keras_Autoencoder_Loss Function_Mean Square Error - Fatal编程技术网

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

Python 基于误差百分比的Keras中自定义加权均方误差损失函数,python,keras,autoencoder,loss-function,mean-square-error,Python,Keras,Autoencoder,Loss Function,Mean Square Error,一般来说,我对Keras和神经网络还不熟悉。我正在尝试实现一个基于均方误差的自定义损失函数,用于异常检测中的多层自动编码器。基本上,我要采用的方法就是从这里开始 不幸的是,我没有发布图片的名声,因为我也是SO的新手,但公式在第2页第3节中是Lprop 这里的直觉是,我不希望自动编码器更新返回误差高于ap损失百分比的数据点的权重。通过这种方式,它可以在与异常值作斗争的同时重新构建数据集中的内联线,从而将它们检测为异常 下面是我尝试过的一些代码和编译后的模型 将keras.backend导入为K c

一般来说,我对Keras和神经网络还不熟悉。我正在尝试实现一个基于均方误差的自定义损失函数,用于异常检测中的多层自动编码器。基本上,我要采用的方法就是从这里开始

不幸的是,我没有发布图片的名声,因为我也是SO的新手,但公式在第2页第3节中是Lprop

这里的直觉是,我不希望自动编码器更新返回误差高于ap损失百分比的数据点的权重。通过这种方式,它可以在与异常值作斗争的同时重新构建数据集中的内联线,从而将它们检测为异常

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

将keras.backend导入为K
c=70.0
def均方误差X(y_真,y_pred):
es=K平方(y_pred-y_true)
常数=百分位数(es,c)
w=K.cast(K.less(常数,K.mean(K.square(y_pred-y_true),axis=-1)),dtype=“float32”)
返回w*K.平均值(K.平方(y_pred-y_true),轴=-1)
#“均方误差”
编译(优化器=adam,损耗=均方误差)
自动编码器。安装(列车,列车,
epochs=num_epochs,
批次尺寸=圆形(长(列)/50),
洗牌=正确,
验证数据=(列车,列车),
详细信息=0)
编码的\u d=编码器预测(列车)
decoded_pred=解码器.predict(编码的_d)
其思想是让K.less为每个错误返回bool,然后将其转换为float作为return语句中的权重。 我知道np.percentile部分可能不适用于张量,但不知道如何完成百分位排序

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

InvalidArgumentError:不兼容的形状:[37,21]与[37]
[{{node loss_25/densite_104_loss/Less}}]

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

如果有人在做类似的事情,你会发现一个潜在的解决方法

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)
我相信这将为所有出现错误的值创建布尔张量
大于阈值,该阈值由批次MSE的平均值加上半个标准偏差定义(如果误差为正态分布,则应对应于数据的第70个百分位作为截止值)。它将布尔值转换为权重0或1作为掩码,然后将其应用于输出MSE损耗

如果有人正在处理类似的问题,则找到一个潜在的解决方法

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)
我相信这将为所有出现错误的值创建布尔张量 大于阈值,该阈值由批次MSE的平均值加上半个标准偏差定义(如果误差为正态分布,则应对应于数据的第70个百分位作为截止值)。它将布尔值转换为权重0或1作为掩码,然后应用于输出MSE损耗