看了许多大神的经验,做一个总结:
-
验证测试集的时候开启
model.eval()
。
-
设置随机种子。
-
pytorch框架中模型加载器dataLoader的属性“shuffle”置为“False”。
如果想看
具体原因
和
简单实现
可以继续往下看:
-
验证测试的时候开启
model.eval()
。因为可能你的模型中含有 BatchNormalization(批归一化)或 Dropout(舍弃),如果未设置模型为eval模式,则验证时会根据每次的batch调整或Dropout还是随机去掉某些神经元,这不符合我们的要求。如果设置模型为eval后,Batch会设置全部数据的均值,Dropout会全部放开,不会随机率舍弃神经元。简单代码如下:
for epoch in num_epoch:
model.train()
....具体训练的代码....
model.eval()
....具体验证的代码....
- 设置随机种子。众所周知,种子会影响每次随机数的取值,而我们的程序中不可避免会用到一些随机数,可能我们自己都不知道哪里用到了。所以最好设置种子一样把。
seed = 0
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
np.random.seed(seed)
random.seed(seed)
torch.manual_seed(seed)
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
————————————————
版权声明:本文为CSDN博主「ASR_THU」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zongza/article/details/90908609
- pytorch框架中模型加载器dataLoader的属性“shuffle”置为“False”。亲身经历过这个问题。看知乎有大神提到有可能是每次测试数据不一样导致分类结果有细微差异,我才想到dataLoader。
dataLoader = torch.utils.data.DataLoader(
dataset=dataset,
batch_size=batch_size,
shuffle=False,
pin_memory=pin_memory,
num_workers=workers
我们总是站在巨人的肩膀上。感激各位前辈和领路人的指引。
参考链接:
- [pytorch] 每次训练的结果都不同(无法复现)
- 知乎:为什么训练好的lstm模型每次输出的结果不一样?
- pytorch中model.train(),model.eval() 和 torch.no_grad()的区别
看了许多大神的经验,做一个总结:验证测试的时候开启model.eval() 。设置随机种子。pytorch框架中模型加载器dataLoader的属性“shuffle”置为“False”。如果想看 具体原因 和 简单实现 可以继续往下看:验证测试的时候开启model.eval() 。因为可能你的模型中含有 BatchNormalization(批归一化)或 Dropout(舍弃),如果未设置模型为eval模式,则验证时会根据每次的batch调整或Dropout还是随机去掉某些神经元,
Val验证集,dataloader设置shuffle=True,图像预处理不采用随机增强,使用同一个模型,测试多轮,结果准确率每轮都不同。
正常情况下,同一个模型,同一批数据,测试结果应该相同。如果不同则可能是每轮输入数据随机增强方式不同,或者是每轮模型参数发生改变。但是我并没有采取随机增强,因此问题主要出在模型改变上。
经过仔细分析代码,发现模型预测中没有加model.eval(),加了后每轮评估结果都相同了。
Pytorch model.eval()做了什么
后来查阅资料发现,m
(conv_block): Sequential(
(0): ReflectionPad2d((1, 1, 1, 1))
(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))
(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False)
(3): ReLU(inplace)
我们神经网络跑模型时会发现相同的超参每次的结果都会不同,因为神经网络算法利用了随机性,比如初始化随机权重,因此用同样的数据训练同一个网络会得到不同的结果。初学者可能会有些懵圈,因为算法表现得不太稳定。但实际上它们就是这么设计的。随机初始化可以让网络通过学习,得到一个所学函数的很好的近似。
然而有的时候结果会相差过多,很难复现。所以我们需要保证prtorch的可重复性。
对于同一个模型和...
模型每次跑的结果不同怎么办?1、首先设置种子2、逐步检查3、可能出错的地方
我使用pytorch跑深度学习模型时发现每次跑的结果都不一样,所以在此总结了一下如何解决的方法。
1、首先设置种子
在代码中加入下面这个函数方法:
def set_random_seed(seed, deterministic=False):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual
pytorch中model.eval()的作用
问题描述:
torch.onnx.export()导出onnx模型后,利用onnxruntime加载onnx模型后,其输出结果与原始.pth模型的输出结果之间存在很大的差距;通过拆分网络结构,定位到nn.BatchNorm2d()层导致;
Batch Normalization和Dropout
Batch Normalization
其作用对网络中间的每层进行归一化处理,并且使用变换重构(Batch Normalization Transform)保证每层提
问题现场:
背景:
Python3.6,
pytorch1.+,使用huggingface.co工具去finetuning bert模型,在多gpu上
训练保存模型,在cpu上加载去做预测。
加载模型,对同一条数据测试结果不一样。
当时检查了:1
1.模型的状态是否是model.eval()?————不是这个问题
2.是否使用torch.no_grad(),这句代码的意思是使得本次过的样本不会更新梯度。————不是这个问题
model.eval()
with torch.no_grad():
1、解决方法
1、确保训练过程中每个epoch的数据之间是不同的,但是又要保证每次实验中的所有epoch数据是相同的;
def batch_iter2(x, y, seed_id, batch_size):
"""生成批次数据"""
data_len = len(x)
num_batch = int((data_len - 1) / batch_size) + 1
np.random.seed(seed_id) # 设置每个epoch的随机种子,保证每个epoch的数据不同