大家好,又见面了,我是你们的朋友全栈君。
Dropout训练实现快速通道:点我直接看代码实现
在深度学习中,dropout训练时我们常常会用到的一个方法——通过使用它,我们可以可以避免过拟合,并增强模型的泛化能力。
通过下图可以看出,dropout训练训练阶段所有模型共享参数,测试阶段直接组装成一个整体的大网络:
那么,我们在深度学习的有力工具——Pytorch中如何实现dropout训练呢?
网上查找到的很多实现都是这种形式的:
out = F.dropout(out, p=0.5)
这种形式的代码非常容易误导初学者,给人带来很大的困扰:
out = out
因此,如果你非要使用torch.nn.functional.dropout的话,推荐的正确方法如下(这里默认你已经import torch.nn as nn
了):
out = nn.functional.dropout(out, p=0.5, training=self.training)
这里更推荐的方法是:nn.Dropout(p),其中p是采样概率。nn.Dropout实际上是对torch.nn.functional.dropout的一个包装, 也将self.training传入了其中,可以有效避免前面所说的大坑。
下面给出一个三层神经网络的例子:
import torch.nn as nn
input_size = 28 * 28
hidden_size = 500
num_classes = 10
# 三层神经网络
class NeuralNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(NeuralNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size) # 输入层到影藏层
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes) # 影藏层到输出层
self.dropout = nn.Dropout(p=0.5) # dropout训练
def forward(self, x):
out = self.fc1(x)
out = self.dropout(out)
out = self.relu(out)
out = self.fc2(out)
return out
model = NeuralNet(input_size, hidden_size, num_classes)
model.train()
model.eval()
另外还有一点需要说明的是,训练阶段随机采样时需要用model.train(),而测试阶段直接组装成一个整体的大网络时需要使用model.eval():
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133466.html原文链接:https://javaforall.cn