【问题标题】:Pytorch Deep Learning - Class Model() and training functionPytorch 深度学习 - 类 Model() 和训练函数
【发布时间】:2019-12-13 10:38:17
【问题描述】:

我是 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]))

【问题讨论】:

  • 我也是 PyTorch 的新手.. 但据我所知,您已经使用 nn.Module 创建了 Net 类,现在您的 Net 类型对象“模型”可以使用 train( ),eval() 属于 nn.Module。
  • 感谢您的回复。现在,我的问题是:为什么我们必须将模型设置为训练模式?我们自己定义一个模型,然后也定义一个训练函数。为什么是 model.train()?
  • 只是因为您使用的是监督学习。创建模型是一步,训练是另一步,评估是下一步。这就是监督学习的工作原理。检查:machinelearningmastery.com/start-here/#process

标签: python oop pytorch


【解决方案1】:

train 与 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的γ和β

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 2018-01-09
    • 1970-01-01
    • 2021-05-05
    • 2020-03-24
    • 2020-11-10
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多