问题描述
我正在使用 UNet 进行多类分割。我的模型输出是,
outputs = layers.Conv3D(n_classes,(1,1,1),padding="same",activation='softmax')(d4)
使用 SparseCategoricalCrossentropy 我可以很好地训练网络。现在我还想尝试将骰子系数作为损失函数。我的真实和预测形状如下,
y_true = tf.constant([0.0,1.0,2.0])
y_pred = tf.constant([[0.9,0.95,0.90],[0.1,0.8,0.5],0.9]])
我已经按如下方式实现了骰子系数,
def softargmax(x,beta=1e10):
x = tf.convert_to_tensor(x)
x_range = tf.range(x.shape.as_list()[-1],dtype=x.dtype)
return tf.reduce_sum(tf.nn.softmax(x*beta) * x_range,axis=-1)
def dice_coef(y_true,y_pred,smooth=1e-7):
y_true = K.flatten(K.one_hot(K.cast(y_true,'int32'),num_classes=n_classes))
y_pred = softargmax(y_pred)
y_pred = K.flatten(K.one_hot(K.cast(y_pred,num_classes=n_classes))
intersect = K.sum(y_true * y_pred,axis=-1)
denom = K.sum(y_true + y_pred,axis=-1)
return K.mean((2. * intersect / (denom + smooth)))
def dice_loss(y_true,y_pred):
return 1 - dice_coef(y_true,y_pred)
我可以单独测试这个
dice_coef(y_true,y_pred)
ValueError: No gradients provided for any variable:
谷歌搜索错误我发现当函数不可微时会发生这种情况。虽然调试问题似乎来自 y_pred = K.flatten...
行,但它适用于 y_true
为什么它失败 y_pred
?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)