我正在创建一个自定义的损失函数,用于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'
我认为有两个问题:
关于我如何看待损失函数的第一次尝试:
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])
任何解决方案的想法都将不胜感激!你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐