Day150:显式指定model.train()和model.eval()

Day150:显式指定model.train()和model.eval()我们的模型中经常会有一些子模型,其在训练时候和测试时候的参数是不同的,比如dropout[6]中的丢弃率和Batch Normalization

欢迎大家来到IT世界,在知识的湖畔探索吧!

我们的模型中经常会有一些子模型,其在训练时候和测试时候的参数是不同的,比如dropout[6]中的丢弃率和Batch Normalization[5]中的γ\gammaγ和β\betaβ等,这个时候我们就需要显式地指定不同的阶段(训练或者测试),在pytorch中我们通过model.train()和model.eval()进行显式指定,具体如:

model = CNNNet(params)
# here we start the training
model.train()
for each in train_data:
	data, label = each
	logit = model(data)
	loss = criterion(logit, label)
	... # just skip
# here we start the evaluation

model.eval() 
with torch.no_grad(): # we dont need grad in eval phase
	for each in eval_data:
		data, label = each
		logit = model(data)
		loss = criterion(logit, label)
		... # just skip

欢迎大家来到IT世界,在知识的湖畔探索吧!

注意,在模型中有BN层或者dropout层时,在训练阶段和测试阶段必须显式指定train()和eval()

调皮的dropout

这个在利用torch.nn.functional.dropout的时候,其参数为:

欢迎大家来到IT世界,在知识的湖畔探索吧!torch.nn.functional.dropout(input, p=0.5, training=True, inplace=False)

注意这里有个training指明了是否是在训练阶段(true表示训练阶段,反之),是否需要对神经元输出进行随机丢弃(训练阶段有dropout;在测试(或推断)阶段,没有dropout,所有的神经元都是活跃的,但是为了补偿与训练阶段相比较的额外信息,让训练和测试的总输出保持一致,就是期望值一致,所以,在测试阶段激活值要乘于保留的概率1-p),这个是需要自行指定的,即便是用了model.train()或者model.eval()都是如此(model.train()与model.eval()作用对象是orch.nn.dropout这个层吧),这个和torch.nn.dropout不同,因为后者是一个(Layer),而前者只是一个函数,不能纪录状态[9]。

Day150:显式指定model.train()和model.eval()

为了防止训练阶段的过拟合,随机去掉神经元。在一个密集的(或全连接的)网络中,对于每一层,给出了一个dropout的概率p。在每次迭代中,每个神经元被去掉的概率为p。Hinton等人的论文建议,输入层的dropout概率为“p=0.2”,隐藏层的dropout概率为“p=0.5”。显然,对输出层感兴趣,这是的预测。所以不会在输出层应用dropout。

Day150:显式指定model.train()和model.eval()

数学上,说每个神经元的丢弃概率遵循概率p的伯努利分布。因此,用一个mask对神经元向量(层)进行了一个元素级的操作,其中每个元素都是遵循伯努利分布的随机变量。

测试(或推断)阶段,没有dropout。所有的神经元都是活跃的。为了补偿与训练阶段相比较的额外信息,用出现的概率作加权权重,让训练和测试的总输出保持一致,就是期望值一致,所以,在测试阶段激活值要乘于保留的概率1-p。所以神经元没有被忽略的概率,是“1 – p”。

  • 什么是 Dropout

简单来说,dropout是指在训练阶段忽略某一层网络中随机选取一部分神经元。所谓“忽略”,是在训练阶段的向前或向后传递期间不考虑这些神经元。

更严格地说,在每个训练阶段,以概率p将单个节点从网络中删除,或者说以概率1-p保留某个节点,同时删除掉的节点的传入和传出连接,这样就剩下一个约简后的网络。

  • 为什么需要Dropout?

答案是“防止过拟合”。

完全连接的层拥有大量的参数,因此,神经元在训练期间彼此之间产生相互依赖性,这抑制了每个神经元个体的能力,导致对训练数据的过拟合。

  • 使用Dropout的正确姿势

训练阶段:对于每个hidden layer、每个训练样本、每次迭代,以概率p随机忽略一部分神经元。

测试阶段:去掉dropout层,使用所有神经元,但将它们的输出都要乘以一个因子1-p(以解释训练期间缺少的激活)。

悄悄地更新,BN层就是个小可爱

在trainning状态下,BN层的统计参数running_mean和running_var是在调用forward()后就更新的,这个和一般的参数不同,容易造成疑惑,考虑到篇幅较长,请移步到[11]。

[9] https://pytorch.org/docs/stable/nn.html?highlight=dropout#torch.nn.functional.dropout

[11]. Pytorch的BatchNorm层使用中容易出现的问题

链接:https://www.jianshu.com/p/cbef8c124277

参考:https://blog.csdn.net/LoseInVain/article/details/82916163

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/22619.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信