我正在创建一个自定义损失函数,以与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”
我相信有两个问题:
我如何看待损失函数的第一次尝试:
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])
任何解决方案的想法都将受到赞赏!