无梯度依赖的张量到numpy变换

2024-09-22 14:27:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个自定义的损失函数,用于CNN架构中的Keras分割。损失应该是一个二元交叉熵损失,每个像素按到前景边界的距离加权。 这个距离很容易用scipy函数scipy.ndimage.morphology.distance_transform_edt计算,但是这个函数需要一个numpy数组作为输入。对于损失函数,我只有“yu真”和“yu pred”,它们都是张量。你知道吗

我尝试使用np_y_true = y_true.eval()将“y\u true”转换为numpy数组,但出现以下错误: ('conv3d\u 19\u target'是y\u true占位符的名称。这个阶段的程序不知道它的形状,尽管它总是(1,64,64,2)。你知道吗

你知道吗tensorflow.python.framework框架.错误_impl.InvalidArgumentError无效参数:您必须为占位符张量'conv3d\u 19\u target'输入一个值,其中dtype float和shape[?,?,?,?,?]你知道吗

我还尝试了np_y_true = y_true.numpy(),结果如下:

AttributeError:'Tensor'对象没有属性'numpy'

我认为有两个问题:

  1. yu true只是一个占位符,因此在第一次读取loss函数时是未知的。你知道吗
  2. Keras/tensorflow认为梯度应该通过所有依赖于yаu真的部分。然而,这不是 这里是必要的,因为这只是一个要计算的权重参数 每次通过时。你知道吗

关于我如何看待损失函数的第一次尝试:

def DFweighted_entropy(): 
    def weighted_loss(y_true,y_pred):
        np_ytrue = y_true.numpy() #OR 
        #np_y_true = K.eval(y_true)

        #Calculate distance-field:
        df_inside = distance_transform_edt(np_ytrue[:,:,:,1]) #Background
        df_outside = distance_transform_edt(np_ytrue[:,:,:,0]) #Foreground
        np_df = np_ytrue[:,:,:,1]*df_inside+np_ytrue[:,:,:,0]*df_outside #Combined

        #Loss: 
        df_loss = (K.max(y_pred,0)-y_pred * y_true + K.log(1+K.exp((-1)*K.abs(y_pred))))*np_df
        return df_loss

    return weighted_loss

在编译模型时使用损失函数:

model.compile(optimizer=keras.optimizers.Adam(lr=1e-4,beta_1=0.9, beta_2=0.999, epsilon=1e-08,decay=0.0),loss = DFweighted_entropy(), metrics=['acc',dice_coefficient])

任何解决方案的想法都将不胜感激!你知道吗


Tags: 函数numpytrue距离dfnptransformkeras