自定义损失功能,跳过NaN输入

时间:2020-01-25 17:33:44

标签: python tensorflow keras autoencoder

我正在构建一个自动编码器,我的数据中包含NaN值。如何创建自定义(MSE)损失函数,该函数在验证数据中遇到NaN时不计算损失?

从网络上获得提示:

def nan_mse(y_actual, y_predicted):
    per_instance = tf.where(tf.is_nan(y_actual),
                            tf.zeros_like(y_actual),
                            tf.square(tf.subtract(y_predicted, y_actual)))
    return tf.reduce_mean(per_instance, axis=0)

但是会损失NaN:

历次1/50 -25s-损失:nan

在每个时期之后,当我尝试在回调函数中使用自定义损失函数时:

predictions = autoencoder.predict(x_pred)
mae = (nan_mse(x_pred, predictions))

TypeError:“选择”操作的输入“ e”具有类型float32,与参数“ t”的类型float64不匹配。

1 个答案:

答案 0 :(得分:1)

我猜,您的损失函数实际上运行良好。 nan值可能来自预测。因此,条件tf.is_nan(y_actual)不会将其过滤掉。 要过滤出预测的nan,您应该执行以下操作:

import tensorflow.compat.v1 as tf
from tensorflow.compat.v1.keras import backend as K
import numpy as np


def nan_mse(y_actual, y_predicted):
    stack = tf.stack((tf.is_nan(y_actual), 
                      tf.is_nan(y_predicted)),
                     axis=1)
    is_nans = K.any(stack, axis=1)
    per_instance = tf.where(is_nans,
                            tf.zeros_like(y_actual),
                            tf.square(tf.subtract(y_predicted, y_actual)))
    print(per_instance)
    return tf.reduce_mean(per_instance, axis=0)

print(nan_mse([1.,1.,np.nan,1.,0.], [1.,1.,0.,0.,np.nan]))

退出:

tf.Tensor(0.2, shape=(), dtype=float32)