测试集的准确率与在训练时测试的结果差距极大

在模型训练过程中,每训练一个epoch,就测试一个epoch,以了解网络性能。
当使用网络测试时,测试集的准确率与在训练时测试的结果差距极大。

经过仔细查证,问题出在dropout上,
在训练过程,直接使用了no_grad()函数来关闭梯度计算,

with torch.no_grad():
    images = images.to(device)

此时训练迭代的测试的过程中未关闭BatchNormalizationDropout,以这种状态进行测试
而在真正测试过程中使用了model.eval()关闭了BatchNormalizationDropout, 故而结果出现极大出入。
(这样也可以解释在每个epoch测试的时候结果的波动较大,因为在测试的过程中每个神经元会有可能性被丢弃(失活))
修正方法为:

for epoch:
	model.train()
	for train:
		xxx
	model.eval()
	for eval:
		with torch.no_grad():
    		xxxx

疑问:
尽管原则上在测试集不使用dropout,但是我在测试时将dropout打开,得到的结果就与在训练时测试的结果相似。尽管有drop_rate=0.1的情况下,多次测试,结果大致相同。

你可能感兴趣的:(VOS)