张量到numpy的转换而没有梯度依赖性

时间:2019-07-15 12:11:34

标签: python numpy tensorflow keras loss-function

我正在创建一个自定义损失函数,以与CNN架构中的Keras一起使用以进行细分。损失应为二进制交叉熵损失,每个像素均按距GT前景边界的距离加权。 使用scipy函数scipy.ndimage.morphology.distance_transform_edt可以轻松计算此距离,但是此函数需要一个numpy数组作为输入。对于损失函数,我只有“ y_true”和“ y_pred”这两个张量。

我尝试使用np_y_true = y_true.eval()将“ y_true”转换为numpy数组,但是出现以下错误: (“ conv3d_19_target”是y_true占位符的名称。尽管程序始终为(1,64,64,64,2),但在此阶段程序的形状尚不清楚。

tensorflow.python.framework.errors_impl.InvalidArgumentError:您必须为占位符张量'conv3d_19_target'输入dtype浮动且形状为[?,?,?,?,?]的值

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

AttributeError:“ Tensor”对象没有属性“ numpy”

我相信有两个问题:

  1. y_true只是一个占位符,因此在首次读取损失函数时未知。
  2. Keras / tensorflow认为,梯度应该穿过依赖于y_true的所有部分。但是这不是 这是必需的,因为这只是要计算的权重参数 每次通过。

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

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])

任何解决方案的想法都将受到赞赏!

0 个答案:

没有答案