python - Pytorch 深度学习 - 类 Model() 和训练函数
问题描述
我是 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
是训练模型的def train(epochs): ...
方法,不是Net
类的属性。model
是Net
类的对象,继承自nn.Module
.
在 PyTorch 中,所有层都继承自nn.Module
并为它们提供了许多通用功能,例如model.children()
or layer.children()
、model.apply()
等
。model.train()
在nn.Module
. 它实际上并不训练模型或任何继承自的层,nn.Module
而是将其设置为训练模式,所以说它相当于做model.set_train()
. 在测试模型之前,您可以调用一种等效方法model.eval()
来设置评估模式。
为什么你甚至需要它?
层/模型中可能有一些参数在训练和评估模式下的行为不同。最明显的例子是BatchNorm
的 γ 和 β
推荐阅读
- java - 如何在选项窗格上显示消息?
- c - 如何找到 PIE 二进制文件的负载重定位?
- javascript - 当 DOM 过于相似时,React SSR 和水合物出现问题
- python - 打开重定向的链接
- php - 在 ColdFusion 中从 Microsoft Teams 自定义 Bot 验证 HMAC
- c - 如何获取systemd上的ntp服务器列表
- typescript - 如何通过传递排除数组(keyof T)[]来缩小对象T的类型?
- amazon-s3 - 按 S3 创建日期划分 Athena 查询
- python - PySpark:在倒数的窗口上计算 cumsum
- python - 如何使用 Opencv 模糊/羽化图像中对象的边缘?