第一个时期的误差极高(Pytorch-图像分割)



为什么在我将网络设置为eval的第一个时期,我的模型对验证数据的错误函数非常高。

如果我使用model.eval((,在前4-5个时期的误差大于40-50k,然后迅速下降到3-4,但如果我把网留在model.train((上,误差只有5-6。

def eval_model(DataLoader, model, criterion, device, withStat, withImage):
model.eval()
eval_epochen_loss = 0
img = None
n_eval = 0
TP, TN, FP, FN = 0, 0, 0, 0
stat = None
for i, data in enumerate(DataLoader):
dicoms, targets = data
dicoms, targets = Variable(dicoms.to(device)), Variable(targets.to(device))
assert targets.shape[1] - 1 == model.n_classes, 
f'Network has been defined with {model.n_classes} output classes, ' 
f'but loaded target have {targets.shape[1] - 1} channels. Please check the labeled data or adjust ' 
f'the network classes. '
preds = model(dicoms)
loss = criterion(preds, targets[:, -1, :, :].long())
eval_epochen_loss += loss.item()
n_eval += dicoms.shape[0]
if withStat:
res = TP_TN_FP_FN_in_batch(targets[:, -1, :, :].cpu().detach().long(), preds.detach().cpu())
TP += res[0]
TN += res[1]
FP += res[2]
FN += res[3]
if withStat:
stat = Statistic(TP, TN, FP, FN)
if withImage:
img_np = np.array(draw_images((dicoms, targets[:, -1], preds), outline_bool=True)).transpose(0, 3, 1, 2)
img = torch.from_numpy(img_np)
return eval_epochen_loss / n_eval, stat, img

在没有看到模型的情况下很难诊断您的问题,但批处理规范在评估模式和训练模式下的表现不同。这很可能就是你有这个问题的原因。Batchnorm在训练期间使用整个训练批次来获得其参数,但在验证/测试期间使用存储的运行平均值。这个运行平均值似乎需要几个时期才能很好地收敛到您的验证集。您的数据是否正确规范化?

最新更新