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

Python Keras自定义损失函数-截尾生存分析,python,tensorflow,keras,Python,Tensorflow,Keras,我试图在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(对数(0.9)+对数(0.8)+对数(0.8)+对数(0.8)+对数(0.7))=0.22 示例2:只有两个标签可用于Y_True Y_true=[0,0

我试图在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(对数(0.9)+对数(0.8)+对数(0.8)+对数(0.8)+对数(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)

您可以使用和的组合来屏蔽
y\u true
以获得所需的结果

将numpy导入为np
导入tensorflow作为tf
y_真=tf常数([
[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.常数([
[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生存损失(y_真实,y_预测):
#为NaN元素创建遮罩
mask=tf.cast(~tf.math.is_nan(y_true),tf.float32)
#沿遮罩的行轴求和以找到'N'`
#针对每个培训实例
Ns=tf.math.reduce_和(掩码,1)
#使用'multiply_no_nan'将'y_pred'中的nan归零`
fst=tf.math.multiply\u no\u nan(y\u true,mask)*tf.math.log(y\u pred)
snd=tf.math.multiply\u no\u nan(1.0-y\u true,mask)*tf.math.log(1.0-y\u pred)
return-tf.math.reduce_和(fst+snd,1)/Ns
生存损失(是真实的,是预测的)
# 

是相同的损失函数吗?不幸的是,我基本上是在尝试编写损失函数,以便考虑的标签数量根据基本事实中的条目数量而变化!不过谢谢你。。。!我懂了。您希望执行二进制交叉熵,其中可用标签的数量可能因培训实例而异(正确吗?)。你能举一个例子,用手计算以显示所需的输出吗?正确!好的,让我试着添加一个示例:)好的,还添加了另一个示例:)嘿,这里-有没有关于在训练/体重更新过程中减量何时减少,然后越来越接近0,然后是NaN的建议。这可能与损失函数有关吗?降低学习率有助于。。。!添加到培训脚本是一个很好的工具。另外,我会检查培训数据是否损坏,是否有NAN。好的,我会看一看,谢谢!