本文共 2935 字,大约阅读时间需要 9 分钟。
PyTorch是一款强大的机器学习框架,支持深度学习模型的开发与训练。本节将介绍PyTorch中处理数据、构建模型、优化模型参数以及模型的保存与加载流程。
在PyTorch中,数据处理是机器学习模型的基础。PyTorch提供了torch.utils.data.DataLoader和torch.utils.data.Dataset两个核心工具。
batch_size = 64train_dataloader = DataLoader(training_data, batch_size=batch_size)test_dataloader = DataLoader(test_data, batch_size=batch_size)
在PyTorch中,模型通常由多个神经网络层组成。可以通过继承nn.Module类来定义模型。
device = "cuda" if torch.cuda.is_available() else "cpu"print(f"Using {device} device")class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() self.flatten = nn.Flatten() self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10) ) def forward(self, x): x = self.flatten(x) logits = self.linear_relu_stack(x) return logits 模型训练需要损失函数和优化器。
loss_fn = nn.CrossEntropyLoss()optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
在训练循环中,模型会逐步优化参数以减少损失。
def train(dataloader, model, loss_fn, optimizer): model.train() size = len(dataloader.dataset) for batch, (X, y) in enumerate(dataloader): X, y = X.to(device), y.to(device) pred = model(X) loss = loss_fn(pred, y) optimizer.zero_grad() loss.backward() optimizer.step() if batch % 100 == 0: print(f"loss: {loss.item():>7f} [{batch*len(X):>5d}/{size:>5d}]") 训练结束后,需要在测试集上评估模型性能。
def test(dataloader, model, loss_fn): model.eval() test_loss, correct = 0, 0 with torch.no_grad(): for X, y in dataloader: X, y = X.to(device), y.to(device) pred = model(X) test_loss += loss_fn(pred, y).item() correct += (pred.argmax(1) == y).type(torch.float).sum().item() test_loss /= len(dataloader) correct /= len(dataloader.dataset) print(f"Test Error: Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f}") 将模型的状态字典保存为文件,便于后续加载和使用。
torch.save(model.state_dict(), "model.pth")print("Saved PyTorch Model State to model.pth") 加载保存的模型状态字典,重新获得模型结构和参数。
model = NeuralNetwork()model.load_state_dict(torch.load("model.pth"))model.eval() classes = [ "T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]x, y = test_data[0][0], test_data[0][1]with torch.no_grad(): pred = model(x) predicted, actual = classes[pred[0].argmax(0)], classes[y] print(f'Predicted: "{predicted}", Actual: "{actual}"') 训练过程中,训练损失逐渐降低,测试准确率逐步提升,表明模型正在有效学习数据特征。
转载地址:http://ywafk.baihongyu.com/