📜  PyTorch的基础(1)

📅  最后修改于: 2023-12-03 15:34:33.213000             🧑  作者: Mango

PyTorch的基础介绍

什么是PyTorch?

PyTorch是一个基于Python的科学计算包,主要针对两类需求:

  • 作为NumPy的替代品,可以利用GPU的性能进行计算
  • 作为一个高级深度学习的平台,具有灵活性和速度,并且支持强大的GPU加速。

PyTorch在以下方面提供了强大的支持:

  • 张量计算(Tensor Computation)与动态构建图(Dynamic Computation Graph)
  • 高效的自动微分(Automatic Differentiation)
  • 快速迭代的原型开发(Fast Prototype Design)
  • 开箱即用的深度学习模型库(Torchvision)
PyTorch的基本数据结构

PyTorch的基本数据结构是张量(Tensor)。张量在NumPy中也有体现,但是,PyTorch的张量可以在GPU或其他加速硬件上运行,能够更高效地进行计算。

创建张量

可以使用torch.tensor函数创建一个张量。通过指定dtype参数,可以指定张量中的元素类型(浮点数、整数等)。

import torch

# 创建一个浮点类型的张量
x = torch.tensor([1, 2, 3], dtype=torch.float32)
print(x)

# 空张量
x = torch.empty(2, 3)
print(x)

# 随机初始化张量
x = torch.rand(2, 3)
print(x)

# 创建具有指定形状的张量,并使用随机数据填充
x = torch.randn(2, 3)
print(x)

# 创建与x有相同形状的张量,并使用随机数据填充
y = torch.rand_like(x, dtype=torch.float32)
print(y)
张量索引和切片

张量可以像NumPy数组一样使用下标和切片操作进行索引和切片。

x = torch.randn(3, 4)
print(x)

# 取第一行第二列的元素
print(x[0][1])

# 取第二列的元素
print(x[:, 1])

# 取前两行后三列的部分
print(x[:2, 1:4])
张量运算

PyTorch支持张量的基本运算,如加、减、乘、除等。

x = torch.randn(3, 4)
y = torch.randn(3, 4)

# 张量加法
z = x + y
print(z)

# 张量点乘
z = torch.dot(x.reshape(-1), y.reshape(-1))
print(z)

# 矩阵乘法
z = torch.mm(x, y.T)
print(z)
PyTorch的动态计算图

PyTorch使用动态计算图来构建神经网络。动态计算图与静态计算图相比具有更好的灵活性和控制力。

动态计算图的基本概念
  • Variable:是PyTorch在动态计算图中引入的一个概念,代表了计算图中的一个节点,可以看作是Tensor的一个封装。每个Variable包含三个属性:data(Tensor的值)、grad(梯度,初始为0)和grad_fn(梯度函数,用于进行反向传播)。
  • Function:是PyTorch中的另一个重要概念,代表了一个计算操作,它接收一个或多个Variable作为输入,并输出一个或多个Variable作为输出。
动态计算图的使用方法
import torch

# 定义两个张量
x = torch.tensor([1, 2], dtype=torch.float32)
y = torch.tensor([2, 3], dtype=torch.float32)

# 将x和y封装成Variable
x = torch.autograd.Variable(x, requires_grad=True)
y = torch.autograd.Variable(y, requires_grad=True)

# 定义计算图
z = x * y
z = torch.sum(z)

# 计算梯度
z.backward()

# 查看x和y的梯度
print(x.grad)
print(y.grad)
PyTorch的神经网络模块

PyTorch中的nn模块提供了很多用于构建神经网络的工具。

模块的基本概念
  • Module:是PyTorch中构建神经网络的基本模块。每个Module都有一个或多个输入(Input)和一个或多个输出(Output),可以被视为一个计算图中的节点。PyTorch中的所有神经网络层、损失函数、优化器等都是Module的子类。
  • Parameter:PyTorch中的Parameter代表了模型中可训练的参数。ParameterVariable的子类,因此拥有Variable的所有属性和方法。
模块的使用方法
import torch
import torch.nn as nn

# 定义一个简单的神经网络模型
class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()

        self.fc1 = nn.Linear(10, 20)
        self.fc2 = nn.Linear(20, 2)

    def forward(self, x):
        x = self.fc1(x)
        x = nn.functional.relu(x)
        x = self.fc2(x)
        return x

# 使用模型进行前向计算
model = Net()
input = torch.randn(1, 10)
output = model(input)
print(output)

# 查看模型中的参数
for name, param in model.named_parameters():
    print(name, param)
PyTorch的优化器

PyTorch中的优化器可以帮助我们更新神经网络模型中的参数,以最小化损失函数的值。

优化器的基本概念
  • Optimizer:是PyTorch中的优化器工具。需要将模型中的所有可训练参数传递给优化器,然后可以使用step方法进行参数更新。
优化器的使用方法
import torch
import torch.nn as nn
import torch.optim as optim

# 定义一个简单的神经网络模型
class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()

        self.fc1 = nn.Linear(10, 20)
        self.fc2 = nn.Linear(20, 2)

    def forward(self, x):
        x = self.fc1(x)
        x = nn.functional.relu(x)
        x = self.fc2(x)
        return x

# 使用模型进行前向计算
model = Net()
input = torch.randn(1, 10)
output = model(input)
print(output)

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 进行参数更新
optimizer.zero_grad()
loss = criterion(output, torch.randn(1, 2))
loss.backward()
optimizer.step()

# 查看模型中的参数
for name, param in model.named_parameters():
    print(name, param)

以上就是PyTorch的基础介绍,希望能够帮助您快速上手使用PyTorch进行深度学习的开发。