繁体   English   中英

Pytorch 深度学习 - 类模型()和训练函数

[英]Pytorch Deep Learning - Class Model() and training function

我是 Pytorch 的新手,我正在阅读本教程以了解如何使用该库进行深度学习。 我在找出部分代码时遇到问题。

有一个名为 Net 的类和一个从它实例化的名为 model 的对象。 然后是称为 train(epoch) 的训练函数。 在 train 函数体的下一行中,我看到了这个: model.train() 我无法理解。 你能帮我理解这部分代码吗? 当该方法尚未在类内部定义时,我们如何调用该类的方法? 为什么该方法与它在内部调用的函数具有完全相同的名称? 这是类定义:
 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 32, kernel_size=3) self.conv2 = nn.Conv2d(32, 64, kernel_size=3) self.conv2_drop = nn.Dropout2d() self.fc1 = nn.Linear(2304, 256) self.fc2 = nn.Linear(256, 17) def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(x.size(0), -1) # Flatten layer x = F.relu(self.fc1(x)) x = F.dropout(x, training=self.training) x = self.fc2(x) return F.sigmoid(x) model = Net() # On CPU # model = Net().cuda() # On GPU

这是这个类之后定义的函数:

 def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): # data, target = data.cuda(async=True), target.cuda(async=True) # On GPU data, target = Variable(data), Variable(target) optimizer.zero_grad() output = model(data) loss = F.binary_cross_entropy(output, target) loss.backward() optimizer.step() if batch_idx % 10 == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.data[0]))

train vs model.train

def train(epochs): ...是训练模型的方法,不是Net类的属性。 modelNet类的对象,它继承自nn.Module
在 PyTorch 中,所有层都继承自nn.Module ,这为它们提供了许多通用功能,例如model.children()layer.children()model.apply()等。
model.train()nn.Module也有类似的实现。 它实际上并没有训练模型或任何继承自nn.Module层,而是将其设置为训练模式,所以说它相当于执行model.set_train() 在测试模型之前,您可以调用一个等效的方法model.eval()来设置评估模式。

为什么你甚至需要它?

层/模型中可能有一些参数在训练和评估模式时会表现不同。 明显的例子是BatchNorm的 γ 和 β

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM