我正在训练有关Kaggle Salt挑战的细分网络。我的骰子和ce减少了,但是随后突然骰子增加了,CE上升了一点,这种情况一直在发生。我整天都在尝试解决此问题,但无法运行我的代码。我仅在10个数据点上运行以过度拟合我的数据,但事实并非如此。任何帮助将不胜感激。
骰子(顶部)和CE的图:
这里是我的骰子和火车:
def dice(input, target,weights=torch.tensor([1,1]).float().cuda()):
smooth=.001
dummy=np.zeros([batch_size,2,100,100]) # create dummy to one hot encode target for weighted dice
dummy[:,0,:,:][target==0]=1 # background class is 0
dummy[:,1,:,:][target==1]=1 # salt class is 1
target=torch.tensor(dummy).float().cuda()
# print(input.size(),input[:,0,:,:].size())
input1=input[:,0,:,:].contiguous().view(-1) #flatten both classes seperately
target1=target[:,0,:,:].contiguous().view(-1)
input2=input[:,1,:,:].contiguous().view(-1)
target2=target[:,1,:,:].contiguous().view(-1)
score1=2*(input1*target1).sum()/(input1.sum()+target1.sum()+smooth) #back
score2=2*(input2*target2).sum()/(input2.sum()+target2.sum()+smooth) #salt
score=1-(weights[0]*score1+weights[1]*score2)/2
if score<0:
score=score-score
return(score)
Heres the train:
def train(epoch):
for idx, batch_data in enumerate(dataloader) :
x, target=batch_data['image'].float().cuda(),batch_data['label'].float().cuda()
optimizer.zero_grad()
output = net(x)
# print(output.size())
output.squeeze_(1)
# print('out',output.size(),target.size())
bce_loss = criterion(output, target.long())
lc.append(bce_loss.item())
dice_loss = dice((output), target)
ld.append(dice_loss.item())
loss = dice_loss + bce_loss
l.append(loss.item())
loss.backward()
optimizer.step()
print('Epoch {}, loss {}, bce {}, dice {}'.format(
epoch, sum(l)/len(l), sum(lc)/len(lc) , sum(ld)/len(ld) ))
这里有其余代码(我从gaggle内核中删除):https://github.com/bluesky314/Salt-Segmentation/blob/master/kernel-2.ipynb 1(这里显示的训练是我第二次运行该单元格(14)时,因此不会出现起伏,但是可以在图中看到)
dataset=DatasetSalt(limit_paths=10)
仅通过采用顶部路径从中获取图像来将数据集限制为任意数量
真的很感谢您的帮助,在此方面花了8多个小时的努力