torch eval() 精度下降

torch模型使用eval模式测试时,可能精度下降非常大,我也遇到了这个问题,在不使用eval()的情况下,模型识别是期望的结果,但是一旦加上eval就会变得很差。
我也找了许多参考资料,大致明白是模型结构里有 BatchNorm 或者 DropOut 导致的问题,但是没找到适合我的解决方式。

然后,这里仅仅是我自己瞎改,找资料后瞎改的,我也不知道细致的原因,也不想知道

我是使用预训练好的模型做测试的,

那么我这里的解决方式就是:

batch_norm = BatchNorm1d(略, 略,track_running_stats=False)

将模型结构里的BatchNorm的track_running_stats设为False,
然后加载模型权重参数时:

model.load_state_dict(load(weight_path, map_location=device), strict=False)

加上 strict = False,这样设置后,使用model.eval()后就没问题了,具体原因我不知道

这仅仅是一个解决问题的小小参考。

如果模型使用eval()会导致精度有问题的话,那么在部署模型为onnx时,onnx模型会和使用eval出现同样的精度问题,也就是说,如果onnx模型的精度大幅下降,也可能是原本torch模型使用eval就有精度问题。

最后,这些只是我,瞎猫碰死耗子的解决方式。

要在 PyTorch 中一边训练一边测试精度,你可以在每个训练步骤之后评估模型的性能。以下是一个基本的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim # 定义模型 class Model(nn.Module): def __init__(self): super(Model, self).__init__() # 定义模型结构 def forward(self, x): # 定义前向传播逻辑 return x # 实例化模型 model = Model() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001) # 训练和测试循环 for epoch in range(num_epochs): # 训练阶段 model.train() for data in train_loader: inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 测试阶段 model.eval() correct = 0 total = 0 with torch.no_grad(): for data in test_loader: inputs, labels = data outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = correct / total print(f"Epoch {epoch+1}: Accuracy = {accuracy}") ``` 在这个示例代码中,首先定义了一个自定义的模型类 `Model`,并实例化了模型对象 `model`。然后,定义了损失函数(这里使用交叉熵损失)和优化器(这里使用随机梯度下降)。接下来,使用一个循环来进行训练和测试。 在训练阶段,将模型设置为训练模式(`model.train()`),然后通过遍历训练数据加载器进行前向传播、计算损失、反向传播和优化参数。 在测试阶段,将模型设置为评估模式(`model.eval()`),然后通过遍历测试数据加载器进行前向传播并计算准确率。通过将正确预测的样本数量除以总样本数,得到准确率。 在每个 epoch 结束后,打印出当前的准确率。 这样,你就可以在 PyTorch 中一边训练一边测试模型的精度。请注意,代码中的 `train_loader` 和 `test_loader` 是你需要自己定义的训练数据和测试数据的数据加载器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值