PyTorch一小时掌握之基本操作篇

  • Post category:Python

下面我将详细讲解“PyTorch一小时掌握之基本操作篇”的完整攻略。

1. 环境搭建

首先需要安装PyTorch,可以通过官网提供的命令进行安装。另外,建议安装Anaconda环境,可以方便地管理Python的各种依赖库。具体步骤如下:

  1. 下载安装Anaconda。
  2. 打开Anaconda Prompt,创建一个pytorch的虚拟环境:conda create -n pytorch python=3.7
  3. 激活虚拟环境:conda activate pytorch
  4. 安装PyTorch和其他依赖库:conda install pytorch torchvision torchaudio cpuonly -c pytorch

2. 张量操作

在PyTorch中,张量(Tensor)是最基本的数据存储类型,同时也是进行各种操作的基本数据类型。可以简单地理解为Python中的数组,但是PyTorch中的张量可以支持GPU加速计算。

2.1 创建张量

可以通过以下方式创建张量:

import torch

# 创建一个3x3的张量
a = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 创建一个1x3的全为0的张量
b = torch.zeros(1, 3)

# 创建一个2x2的随机张量
c = torch.randn(2, 2)

2.2 张量的基本操作

张量可以进行各种数学运算,如加减乘除、矩阵乘法、转置等。

import torch

a = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

c = a + b  # 加法
d = torch.mm(a, b.t())  # 矩阵乘法
e = a.t()  # 转置

2.3 张量的索引和切片

张量可以通过索引和切片操作获取其内部的元素。

import torch

a = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

print(a[0][1])  # 输出第一行第二个元素
print(a[1:])  # 输出第二行及以后的所有元素
print(a[:, 0])  # 输出第一列的所有元素

3. 自动求导

PyTorch的一个重要特性是支持自动求导(Automatic Differentiation),这意味着可以方便地计算数据的梯度,从而进行优化过程的实现。

3.1 张量的梯度

对于每一个张量,可以通过设置其requires_grad属性为True来保留其梯度信息。

import torch

x = torch.Tensor([1, 2, 3])
x.requires_grad = True

3.2 自动求导的使用

自动求导可以通过autograd模块实现。

import torch

x = torch.Tensor([1, 2, 3])
x.requires_grad = True

y = 2 * x.sum() + 3
y.backward()

print(x.grad)  # 输出梯度

示例1:线性回归模型

以下示例展示了如何使用PyTorch构建一个简单的线性回归模型。

import torch

# 构造训练数据
x_train = torch.Tensor([[1], [2], [3], [4]])
y_train = torch.Tensor([[2], [4], [6], [8]])

# 定义模型
class LinearRegression(torch.nn.Module):
    def __init__(self):
        super(LinearRegression, self).__init__()
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        out = self.linear(x)
        return out

# 初始化模型和优化器
model = LinearRegression()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 进行训练
for epoch in range(1000):
    y_pred = model(x_train)
    loss = torch.nn.functional.mse_loss(y_pred, y_train)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

# 输出模型参数
print(list(model.parameters()))

示例2:手写数字识别模型

以下示例展示了如何使用PyTorch构建一个简单的手写数字识别模型。

import torch
import torchvision
import torchvision.transforms as transforms

# 获取数据集
transform = transforms.Compose([transforms.ToTensor(), 
                                transforms.Normalize((0.5,), (0.5,))])
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)

# 定义模型
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(torch.nn.functional.relu(self.conv1(x)))
        x = self.pool(torch.nn.functional.relu(self.conv2(x)))
        x = x.view(-1, 16 * 4 * 4)
        x = torch.nn.functional.relu(self.fc1(x))
        x = torch.nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 初始化模型和优化器
model = Net()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

# 进行训练
for epoch in range(2):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(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