先说结论:model验证完之后忘了转回训练模式(模型里有batchnorm和dropout会出问题)
原本代码结构:
loss_fn = nn.CrossEntropyLoss()
def train(dataloader, model, loss_fn, ...):
for x,y in dataloader:
...
feature = model.forward(x)
pred = model.pred(feature)
loss = loss_fn(pred, y)
...
def val(dataloader,model,...):
model.eval()
for x,y in dataloader:
...
...
model.train()
for iteration in range(iteration_per_epoch * epoch):
train(...)
if iteration%500==0:
val(...)
现象:我发现,在500次迭代之前(第一次验证之前)训练都不会出现问题,一旦验证过一次,之后的训练中的loss值会突然剧增(loss增大到1.54e+18这个量级),紧接着特征提取时feature会出现nan值。
解决:每次训练之前都要设置model.tr