基础介绍
- 学习基础知识
- 机器学习的基本流程
- 快速入门
- 一个简单的目标分类任务
- 执行过程
学习基础知识
机器学习的基本流程
- 数据处理
- 创建模型
- 优化模型参数
- 保存训练的模型
快速入门
一个简单的目标分类任务
识别衣服的类型
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor# Define model
class NeuralNetwork(nn.Module):def __init__(self):super().__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 logitsdef train(dataloader, model, loss_fn, optimizer):size = len(dataloader.dataset)model.train()for batch, (X, y) in enumerate(dataloader):X, y = X.to(device), y.to(device)# Compute prediction errorpred = model(X)loss = loss_fn(pred, y)# Backpropagationloss.backward()optimizer.step()optimizer.zero_grad()if batch % 100 == 0:loss, current = loss.item(), (batch + 1) * len(X)print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]")def test(dataloader, model, loss_fn):size = len(dataloader.dataset)num_batches = len(dataloader)model.eval()test_loss, correct = 0, 0with 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 /= num_batchescorrect /= sizeprint(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")if __name__ == "__main__":# 处理数据# Download training data from open datasets.training_data = datasets.FashionMNIST(root="data",train=True,download=True,transform=ToTensor(),)# Download test data from open datasets.test_data = datasets.FashionMNIST(root="data",train=False,download=True,transform=ToTensor(),)batch_size = 64# Create data loaders.train_dataloader = DataLoader(training_data, batch_size=batch_size)test_dataloader = DataLoader(test_data, batch_size=batch_size)for X, y in test_dataloader:print(f"Shape of X [N, C, H, W]: {X.shape}")print(f"Shape of y: {y.shape} {y.dtype}")break# 创建模型# Get cpu, gpu or mps device for training.device = ("cuda"if torch.cuda.is_available()else "mps"if torch.backends.mps.is_available()else "cpu")print(f"Using {device} device")model = NeuralNetwork().to(device)print(model)# 优化模型参数# 损失函数loss_fn = nn.CrossEntropyLoss()# 优化器optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)epochs = 20for t in range(epochs):print(f"Epoch {t + 1}\n-------------------------------")train(train_dataloader, model, loss_fn, optimizer)test(test_dataloader, model, loss_fn)print("Done!")# 保存模型torch.save(model.state_dict(), "model.pth")print("Saved PyTorch Model State to model.pth")# 加载模型model = NeuralNetwork().to(device)model.load_state_dict(torch.load("model.pth"))# 使用训练的模型进行预测"""“t恤/顶”,“裤子”,“套衫”,“衣服”,“外套”,“凉鞋”,“衬衫”,“运动鞋”,“包”,“踝靴”,"""classes = ["T-shirt/top","Trouser","Pullover","Dress","Coat","Sandal","Shirt","Sneaker","Bag","Ankle boot",]model.eval()x, y = test_data[0][0], test_data[0][1]with torch.no_grad():x = x.to(device)pred = model(x)predicted, actual = classes[pred[0].argmax(0)], classes[y]print(f'Predicted: "{predicted}", Actual: "{actual}"')
执行过程
/Users/futuredeng/anaconda3/envs/pyspide6_study/bin/python -X pycache_prefix=/Users/futuredeng/Library/Caches/JetBrains/PyCharm2024.1/cpython-cache /Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd.py --multiprocess --qt-support=auto --client 127.0.0.1 --port 52646 --file /Users/futuredeng/PycharmProjects/pyspide6_study/s_torch/demo.py
已连接到 pydev 调试器(内部版本号 241.14494.19)Shape of X [N, C, H, W]: torch.Size([64, 1, 28, 28])
Shape of y: torch.Size([64]) torch.int64
Using mps device
NeuralNetwork((flatten): Flatten(start_dim=1, end_dim=-1)(linear_relu_stack): Sequential((0): Linear(in_features=784, out_features=512, bias=True)(1): ReLU()(2): Linear(in_features=512, out_features=512, bias=True)(3): ReLU()(4): Linear(in_features=512, out_features=10, bias=True))
)
Epoch 1
-------------------------------
loss: 2.298847 [ 64/60000]
loss: 2.291248 [ 6464/60000]
loss: 2.278691 [12864/60000]
loss: 2.270169 [19264/60000]
loss: 2.247777 [25664/60000]
loss: 2.226532 [32064/60000]
loss: 2.221170 [38464/60000]
loss: 2.191688 [44864/60000]
loss: 2.186391 [51264/60000]
loss: 2.159593 [57664/60000]
Test Error: Accuracy: 48.9%, Avg loss: 2.151264 Epoch 2
-------------------------------
loss: 2.160394 [ 64/60000]
loss: 2.149280 [ 6464/60000]
loss: 2.097811 [12864/60000]
loss: 2.111865 [19264/60000]
loss: 2.052902 [25664/60000]
loss: 2.002435 [32064/60000]
loss: 2.016076 [38464/60000]
loss: 1.941067 [44864/60000]
loss: 1.946122 [51264/60000]
loss: 1.868463 [57664/60000]
Test Error: Accuracy: 58.9%, Avg loss: 1.870417 Epoch 3
-------------------------------
loss: 1.907855 [ 64/60000]
loss: 1.873430 [ 6464/60000]
loss: 1.759730 [12864/60000]
loss: 1.795776 [19264/60000]
loss: 1.683292 [25664/60000]
loss: 1.641434 [32064/60000]
loss: 1.654433 [38464/60000]
loss: 1.561658 [44864/60000]
loss: 1.587600 [51264/60000]
loss: 1.478837 [57664/60000]
Test Error: Accuracy: 60.4%, Avg loss: 1.501103 Epoch 4
-------------------------------
loss: 1.573581 [ 64/60000]
loss: 1.536037 [ 6464/60000]
loss: 1.387229 [12864/60000]
loss: 1.457505 [19264/60000]
loss: 1.340816 [25664/60000]
loss: 1.339017 [32064/60000]
loss: 1.352573 [38464/60000]
loss: 1.279530 [44864/60000]
loss: 1.314921 [51264/60000]
loss: 1.217413 [57664/60000]
Test Error: Accuracy: 63.3%, Avg loss: 1.242960 Epoch 5
-------------------------------
loss: 1.320792 [ 64/60000]
loss: 1.301409 [ 6464/60000]
loss: 1.135017 [12864/60000]
loss: 1.243455 [19264/60000]
loss: 1.120873 [25664/60000]
loss: 1.144230 [32064/60000]
loss: 1.168045 [38464/60000]
loss: 1.104519 [44864/60000]
loss: 1.145055 [51264/60000]
loss: 1.060252 [57664/60000]
Test Error: Accuracy: 64.9%, Avg loss: 1.082238 Done!
Saved PyTorch Model State to model.pth
Predicted: "Ankle boot", Actual: "Ankle boot"进程已结束,退出代码为 0