当前位置: 首页 > 知识库问答 >
问题:

Keras自定义损失函数-截尾生存分析

荀辰钊
2023-03-14

我试图在Keras中构造一个自定义损失函数-这是用于生存分析中的删失数据。

这种损失函数本质上是二元交叉熵,即多标签分类,但是损失函数中的求和项需要根据Y_true标签的可用性而变化。见下面的例子:

示例1:Y_可用的所有标签均为True

Y_true=[0,0,0,1,1]

Y_pred=[0.1,0.2,0.2,0.8,0.7]

损失=-1/5(log(0.9)log(0.8)log(0.8)log(0.8)log(0.7)) = 0.22

示例2:只有两个标签可用于Y_True

Y_true=[0,0,--]

Y_pred=[0.1,0.2,0.1,0.9,0.9]

损失=-1/2(对数(0.9)对数(0.8))=0.164

例3:只有一个标签可用于Y_True

Y_true=[0,-,-,--]

Y_pred=[0.1,0.2,0.1,0.9,0.9]

损失=-1(对数(0.9))=0.105

在示例一的情况下,我们的损失将通过上述公式计算,K=5。在示例2中,我们的损失将以K=2计算(即,仅根据地面真相中可用的前两项进行评估)。损耗函数需要根据Y_真实可用性进行调整。

我尝试了自定义Keras损失函数...然而,我正在努力如何在张量流中基于nan索引进行过滤。有人对上面描述的自定义损失函数的编码有建议吗?

def nan_binary_cross_entropy(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)))

    FILTER HERE
    return K.binary_crossentropy(y_filt, y_filt), axis=-1)

共有1个答案

弘康安
2023-03-14

您可以使用tf的组合。数学是南tf。数学将_no_nan相乘以屏蔽您的y_true以获得所需结果。

import numpy as np
import tensorflow as tf


y_true = tf.constant([
    [0.0, 0.0, 0.0, 1.0, 1.0],
    [0.0, 0.0, np.nan, np.nan, np.nan],
    [0.0, np.nan, np.nan, np.nan, np.nan],
])


y_pred = tf.constant([
    [0.1, 0.2, 0.2, 0.8, 0.7],
    [0.1, 0.2, 0.1, 0.9, 0.9],
    [0.1, 0.2, 0.1, 0.9, 0.9],
])


def survival_loss_fn(y_true, y_pred):
    # create a mask for NaN elements
    mask = tf.cast(~tf.math.is_nan(y_true), tf.float32)
    # sum along the row axis of the mask to find the `N`
    # for each training instance
    Ns = tf.math.reduce_sum(mask, 1)
    # use `multiply_no_nan` to zero out the NaN in `y_pred`
    fst = tf.math.multiply_no_nan(y_true, mask) * tf.math.log(y_pred)
    snd = tf.math.multiply_no_nan(1.0 - y_true, mask) * tf.math.log(1.0 - y_pred)
    return -tf.math.reduce_sum(fst + snd, 1) / Ns


survival_loss_fn(y_true, y_pred)
# <tf.Tensor: shape=(3,), [0.22629324, 0.16425204, 0.10536055], dtype=float32)>
 类似资料:
  • 嗨,我一直试图使一个自定义损失函数在kerasdice_error_coefficient。它有它的实现在张量板和我尝试使用相同的函数在keras与张量流但它不断返回一个NoneType当我使用model.train_on_batch或model.fit在那里,因为它给适当的值时,使用在模型中的指标...能不能请人帮帮我我该怎么办?我尝试过跟随像Keras-FCN这样的库,在那里他使用了自定义损失

  • 我手头有一个问题,它优化了一个损失函数,而不是y_pred和y_true的函数。通过Keras留档后,我发现所有自定义损失函数必须是y_pred和y_true的函数。 在Keras中是否有其他方法实现我的损失函数?

  • 我有一个NN,它有两个相同的CNN(类似于暹罗网络),然后合并输出,并打算在合并的输出上应用自定义损失函数,如下所示: 在我的自定义损失函数中,我需要将y垂直分解为两块,然后对每一块应用分类交叉熵损失。但是,我不断从我的损失函数得到dtype错误,例如: ()中的ValueError回溯(最近一次调用)---- /usr/local/lib/python3。5/地区包/KERA/发动机/培训。编译

  • 我在Tensorflow后端使用Keras。我想创建一个自定义损失函数,它将获得两个直方图之间的欧几里德距离,但我得到了以下错误: TypeError:“Mul”Op的输入“y”的类型float32与参数“x”的类型int32不匹配。 因此,我不知道如何定义我的损失函数。 我试图修改代码,但我得到另一个错误。“h_true=tf.cast(h_true,dtype=tf.dtypes.float3

  • 我正在尝试使用Keras创建自定义损失函数。我想根据输入计算损失函数并预测神经网络的输出。 我尝试在Keras中使用自定义loss函数。我认为y_true是我们为训练提供的输出,y_pred是神经网络的预测输出。下面的损失函数与 Keras 中的“mean_squared_error”损失相同。 我想使用神经网络的输入也计算自定义损失函数除了mean_squared_error损失。有没有办法将输

  • 我需要一些帮助与keras损失函数。我一直在Tensorflow后端的keras上实现自定义损失功能。 我已经在numpy中实现了自定义损失函数,但如果能将其转换为keras损失函数,那就太好了。丢失函数采用数据帧和用户id序列。如果用户id不同,则相同用户id的欧氏距离为正和负。函数返回数据帧的合计标量距离。 我试图实现到keras损失函数。我提取Numpy数组从y_true和y_pred张量对