前言:最近在把两个模型的代码整合到一起,发现有一个模型的代码整合后性能大不如前,但基本上是源码迁移,找了一天原因才发现是因为model.eval()和model.train()放错了位置!!!故在此介绍一下pytroch框架下model.train()、model.eval()的作用和不同点。
一、model.train、model.eval
1.model.train和model.eval放在代码什么位置
简单的说:
model.train放在网络训练前,model.eval放在网络测试前。
常见的位置摆放错误(也是我犯的错误)有把model.train()放在for epoch in range(epoch):前面,同时在test或者val(测试或者评估函数)中只放置model.eval,这就导致了只有第一个epoch模型训练是使用了model.train(),之后的epoch模型训练时都采用model.eval().可能会影响训练好模型的性能。
修改方式:可以在test函数里return前面添加model.train()或者把model.train()放到for epoch in range(epoch):语句下面。
model.train()
for epoch in range(epoch):
for train_batch in train_loader:
...
zhibiao = test(epoch, test_loader, model)
def test(epoch, test_loader, model):
model.

本文揭示了在PyTorch中model.train()和model.eval()的常见误用,强调了它们在BN层和Dropout行为上的区别。正确位置是训练前model.train(),测试前model.eval(),避免影响模型性能。解释了BN层保持不变的均值和方差,以及dropout在训练与测试中的不同作用。
1371

被折叠的 条评论
为什么被折叠?



