我正在使用U-Net样式神经网络进行定义的分割和骰子损失工作
def dice_loss(y_true, y_pred):
smooth = 1.
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = y_true_f * y_pred_f
score = (2. * K.sum(intersection) + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
return 1. - score
但是,我只想在地面真实分割周围的像素上训练该模型。一种方法是在分割上放置一个框,然后从分割中制作出新图像,然后使用此类图像进行训练。但是,在这种情况下会丢失很多背景上下文。更好的方法是形成一个损失函数,该函数仅对拟合在真实情况下的框周围的预测进行惩罚,而忽略该框外的网络给我们提供的值。为此,我尝试了以下损失函数,但不适用于张量。以下是我未成功的尝试。有什么方法可以调整它以使其正常工作吗?
def getbound(a):
min_x=10000
min_y=10000
max_x=-1
max_y=-1
rows=a.shape[0]
cols=a.shape[1]
for y in range(0, rows):
for x in range(0, cols):
if(a[y,x]>0):
if(x>max_x):
max_x=x
if(y>max_y):
max_y=y
if(x<min_x):
min_x=x
if(y<min_y):
min_y=y
return[min_x,min_y,max_x,max_y]
def box_dice_loss(y_true, y_pred):
smooth = 1.
padding=32
print(y_true.shape)
[min_x,min_y,max_x,max_y]=getbound(y_true)
min_x-=padding
min_y-=padding
max_x+=padding
max_y+=padding
rows=y_true.shape[0]
cols=y_true.shape[1]
for y in range(0, rows):
for x in range(0, cols):
if(y<min_y or y>max_y or x<min_x or x>max_x):
y_pred[y,x]=y_true[y,x]
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = y_true_f * y_pred_f
score = (2. * K.sum(intersection) + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
return 1. - score
当前错误是当网络初始化张量时,没有任何定义的形状,所以我得到了这个输出
使用TensorFlow后端。 (?,?,?,?)在getbound中 对于范围(0行)中的y:TypeError:索引返回了非int(类型NoneType)