前言:
最近在看不同的代码,发现有几个地方存在疑惑,所以梳理一下。
1. model.eval() model.train()
2.volatile=True or false
3. requires_grad = True or false
4. with torch.no_grad():
这个几个地方用来操作或者限定tensor在训练或者测试阶段是否进行:求导,或者一些其他限定。
一、 model.eval() model.train()
官方文档
从红色的方框可以看出model.eval() = model.train(False),那么再来看model.train()
几层意思:
1.等价关系
>> model.train() = model.train(True)
>>model.eval() = model.train(False)
2.这种命令只对特定的模块起作用,例如Dropout, BatchNorm
, etc.
model的eval方法主要是针对某些在train和predict两个阶段会有不同参数的层。比如Dropout层和BN层。但是在查阅资料,没有找到除了这两个以外的其他的模块。
如果模型中有BN层(Batch Normalization)和Dropout,在测试时添加model.eval()。model.eval()是保证BN层能够用全部训练数据的均值和方差,即测试过程中要保证BN层的均值和方差不变。对于Dropout,model.eval()是利用到了所有网络连接,即不进行随机舍弃神经元。否则的话,有输入数据,即使不训练,它也会改变权值。这是model中含有BN层和Dropout所带来的的性质。
总结:model.eval() model.train()只对例如