自定义keras损失函数中的张量形状问题

时间:2018-09-05 02:21:35

标签: python tensorflow keras

据我了解,张量y_true的形状应与y_trainy_val相同。但是,当我放入代码

print('my true_tensor shape is', K.int_shape(y_true))

我明白了

my predicted tensor shape is (None, 1)

y_train的形状为(800, 2)y_train也是数据库格式,不确定是否重要。两列分别是死亡(1 =是,0 = n0)和生存(以月为单位的时间)。我想保留这两列,因为最终,我将要计算一致性索引。

顺便说一句,我对y_pred做同样的事情并得到

my true_tensor shape is (None, None)

不确定这是否正确。我的模型的输出应该是每个输入值一个值(对于Cox比例风险模型为log_risk)。

我知道我无法正确地索引y_true来从死亡列中获取值,但是我不知道自称y_true张量只有1列而不是2。我也知道我只是将y_true用于死亡列,并仅使用我的预测(y_pred)将损失函数最小化。

这是我的损失函数的代码:

from keras import backend as K


# y_pred = prediction of the model (log risk)
# y_true = death  "1 is yes and 0 is no"

def avg_partial_likelihood(y_true, y_pred):

    print('my true_tensor shape is', K.int_shape(y_true))
    print('my predicted tensor shape is', K.int_shape(y_pred))

    # hazard ratio
    hazard_ratio = K.exp(y_pred)

    #log risk
    log_risk = K.log(K.sum(hazard_ratio))

    #uncensored_likelihood 
    uncensored_likelihood = y_pred - log_risk

    #censored likelihood
    print(K.ndim(y_true))

    censored_likelihood = uncensored_likelihood * y_true



    #num_observed events
    num_observed_events = K.sum(y_true)

    #neg_likelihood
    neg_likelihood = -K.sum(censored_likelihood) / num_observed_events

    return neg_likelihood

切线:如果有兴趣,我正在尝试复制https://github.com/jaredleekatzman/DeepSurv/blob/master/deepsurv/deep_surv.py,并试图在def _negative_log_likelihood(self, E, deterministic = False):下复制其损失函数,他们使用theano。

0 个答案:

没有答案