Python KERAS:来自loglikehood的自定义损失函数

Python KERAS:来自loglikehood的自定义损失函数,python,keras,log-likelihood,Python,Keras,Log Likelihood,我试图实现一个自定义损失函数,如第19页等式3.8所示。我实现了以下目标: import numpy as np import keras.backend as T from keras import models def costume_loss(censored): '''costume loss function''' def loglikelihood_function(y_true,y_pred,censored): '''implements li

我试图实现一个自定义损失函数,如第19页等式3.8所示。我实现了以下目标:

import numpy as np
import keras.backend as T
from keras import models

def costume_loss(censored):
    '''costume loss function'''

    def loglikelihood_function(y_true,y_pred,censored):
        '''implements likelihood function as per equation 3.8 in using survival prediction techniques to learn consumer'''
        results=[]
        n=T.int_shape(y_pred)[0]  #number of instances
        K=T.int_shape(y_pred)[1]    #number of subintervals

        print(T.int_shape(y_pred)[0],T.int_shape(y_pred)[1])


        for i in range(n):
            if censored[i]==0:
                sum1=np.sum([y_pred[i][j]*y_true[i][j] for j in range(K)])
                sum2=np.sum([math.exp(np.sum([ y_pred[i][k]  for k in range(j,K)])) for j in range(K)])
                results.append(-(sum1-math.log(sum2)))      
            else:
                sum1=np.sum([y_true[i][j]*math.exp(np.sum([y_pred[i][k] for k in range(j,K)]))   for j in range(K)])
                sum2=np.sum([math.exp(np.sum([ y_pred[i][k]  for k in range(j,K)])) for j in range(K)])
            results.append(-(math.log(sum1)-math.log(sum2))) 

        x=tf.constant(np.array(results,dtype='float64'))   #convert into tensor
        return T.mean(x)

    def loss_function(y_true,y_pred):
        return loglikelihood_function(y_true,y_pred,censored)

    return loss_function
但是,当我尝试编译模型时:

model.compile(optimizer='rmsprop',loss=costume_loss(censored=c),metrics=['accuracy'])
我要走了

TypeError: 'NoneType' object cannot be interpreted as an integer
在计算时,似乎批次大小未定义。 有人能给我指出正确的方向吗?也许我需要用张量运算来实现它?如果是,怎么做


谢谢

n
K
整数吗?
c
设置在什么位置?
y\u pred
的形状是什么?嗨!是的,n和K都是整数。C是一个0或1的数组,表示每个样本是否被删失;y_pred应该是nn中输出层的输出。是
n
K
整数吗?
c
设置在什么位置?
y\u pred
的形状是什么?嗨!是的,n和K都是整数。C是一个0或1的数组,表示每个样本是否被删失;y_pred应该是nn中输出层的输出。