在PyTorch中,我们可以使用net.train()
和net.eval()
方法来切换模型的训练模式和评估模式。这两个方法的主要区别在于是否启用了一些特定的模块,例如Dropout和Batch Normalization。在本文中,我们将详细介绍net.train()
和net.eval()
的使用说明,并提供两个示例来说明它们的用法。
net.train()
和net.eval()
的使用说明
net.train()
当我们调用net.train()
方法时,模型将进入训练模式。在训练模式下,一些特定的模块,例如Dropout和Batch Normalization,将被启用。这是因为在训练过程中,我们需要使用Dropout来防止过拟合,并使用Batch Normalization来加速收敛。
在训练模式下,我们需要手动计算损失函数,并使用反向传播算法来更新模型的参数。例如,我们可以使用以下代码来训练一个简单的线性回归模型:
import torch
# 定义模型
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = torch.nn.Linear(1, 1)
def forward(self, x):
x = self.fc1(x)
return x
# 创建数据集
x = torch.randn(100, 1)
y = 3 * x + 1
# 创建模型和优化器
net = Net()
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
# 进入训练模式
net.train()
# 训练模型
for epoch in range(100):
optimizer.zero_grad()
outputs = net(x)
loss = torch.nn.functional.mse_loss(outputs, y)
loss.backward()
optimizer.step()
在这个示例中,我们首先定义了一个包含一个线性层的线性回归模型。然后,我们创建了一个包含100个样本的数据集,并使用随机梯度下降优化器来训练模型。在训练模式下,我们手动计算了均方误差损失函数,并使用反向传播算法来更新模型的参数。
net.eval()
当我们调用net.eval()
方法时,模型将进入评估模式。在评估模式下,一些特定的模块,例如Dropout和Batch Normalization,将被禁用。这是因为在评估过程中,我们不需要使用Dropout来防止过拟合,并且Batch Normalization的统计信息应该是固定的。
在评估模式下,我们可以使用模型的forward()
方法来进行前向传播,并计算模型的输出。例如,我们可以使用以下代码来评估一个简单的线性回归模型:
import torch
# 定义模型
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = torch.nn.Linear(1, 1)
def forward(self, x):
x = self.fc1(x)
return x
# 创建数据集
x = torch.randn(100, 1)
y = 3 * x + 1
# 创建模型
net = Net()
# 进入评估模式
net.eval()
# 评估模型
with torch.no_grad():
outputs = net(x)
loss = torch.nn.functional.mse_loss(outputs, y)
在这个示例中,我们首先定义了一个包含一个线性层的线性回归模型。然后,我们创建了一个包含100个样本的数据集,并使用模型的forward()
方法来进行前向传播,并计算模型的输出。在评估模式下,我们使用了torch.no_grad()
上下文管理器来禁用梯度计算,从而加速评估过程。
示例1:使用net.train()
训练一个卷积神经网络模型
在这个示例中,我们将使用net.train()
方法来训练一个简单的卷积神经网络模型。我们将使用MNIST数据集来训练模型,并使用交叉熵损失函数和Adam优化器来训练模型。
import torch
from torch.utils.data import DataLoader
from torchvision.datasets import MNIST
from torchvision.transforms import ToTensor
import torch.nn.functional as F
# 定义卷积神经网络模型
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = torch.nn.Conv2d(1, 6, 5)
self.pool = torch.nn.MaxPool2d(2, 2)
self.conv2 = torch.nn.Conv2d(6, 16, 5)
self.fc1 = torch.nn.Linear(16 * 4 * 4, 120)
self.fc2 = torch.nn.Linear(120, 84)
self.fc3 = torch.nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# 加载MNIST数据集
train_data = MNIST(root='data', train=True, download=True, transform=ToTensor())
# 创建DataLoader对象
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)
# 创建模型和优化器
net = Net()
optimizer = torch.optim.Adam(net.parameters(), lr=0.001)
# 进入训练模式
net.train()
# 训练模型
for epoch in range(5):
running_loss = 0.0
for i, data in enumerate(train_loader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = net(inputs)
loss = F.cross_entropy(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 100 == 99:
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 100))
running_loss = 0.0
在这个示例中,我们首先定义了一个包含两个卷积层和三个全连接层的卷积神经网络模型。然后,我们加载了MNIST数据集,并使用DataLoader
来加载数据集。我们使用交叉熵损失函数和Adam优化器来训练模型。在训练模式下,我们手动计算了交叉熵损失函数,并使用反向传播算法来更新模型的参数。
示例2:使用net.eval()
评估一个卷积神经网络模型
在这个示例中,我们将使用net.eval()
方法来评估一个已经训练好的卷积神经网络模型。我们将使用MNIST数据集来评估模型,并计算模型的准确率。
import torch
from torch.utils.data import DataLoader
from torchvision.datasets import MNIST
from torchvision.transforms import ToTensor
import torch.nn.functional as F
# 定义卷积神经网络模型
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = torch.nn.Conv2d(1, 6, 5)
self.pool = torch.nn.MaxPool2d(2, 2)
self.conv2 = torch.nn.Conv2d(6, 16, 5)
self.fc1 = torch.nn.Linear(16 * 4 * 4, 120)
self.fc2 = torch.nn.Linear(120, 84)
self.fc3 = torch.nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# 加载MNIST数据集
test_data = MNIST(root='data', train=False, download=True, transform=ToTensor())
# 创建DataLoader对象
test_loader = DataLoader(test_data, batch_size=64, shuffle=False)
# 加载模型
net = Net()
net.load_state_dict(torch.load('model.pth'))
# 进入评估模式
net.eval()
# 评估模型
correct = 0
total = 0
with torch.no_grad():
for data in test_loader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (
100 * correct / total))
在这个示例中,我们首先定义了一个包含两个卷积层和三个全连接层的卷积神经网络模型。然后,我们加载了MNIST数据集,并使用DataLoader
来加载数据集。我们加载了已经训练好的模型,并使用net.eval()
方法来进入评估模式。在评估模式下,我们使用模型的forward()
方法来进行前向传播,并计算模型的输出。最后,我们计算了模型的准确率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytorch 中net.train 和 net.eval的使用说明 - Python技术站