我是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]))
答案 0 :(得分:2)
def train(epochs): ...
是训练模型的方法,而不是Net
类的属性。 model
是Net
类的对象,继承自nn.Module
。
在PyTorch中,所有图层都继承自nn.Module
,这为它们提供了许多常见功能,例如model.children()
或layer.children()
,model.apply()
等。
model.train()
在nn.Module
中类似地实现。它实际上并不会训练模型或从nn.Module
继承的任何层,而是将其设置为训练模式,因此,它相当于进行model.set_train()
。
在测试模型之前,您可以调用等效方法model.eval()
来设置评估模式。
在层/模型中可能存在一些参数,这些参数可能在训练和评估模式下作用不同。最明显的例子是BatchNorm
的γ和β