文章目录
- [1. PyTorch 介绍](#1. PyTorch 介绍)
- [2. 张量基本操作](#2. 张量基本操作)
-
- [2.1 创建张量](#2.1 创建张量)
- [2.2 重塑张量](#2.2 重塑张量)
- [2.3 索引和切片](#2.3 索引和切片)
- [2.4 数据类型转换](#2.4 数据类型转换)
- 3.深度学习相关的操作
-
- 3.1损失函数
- [3.2 层和模型](#3.2 层和模型)
- [3.3 优化器](#3.3 优化器)
- [3.4 自动求导](#3.4 自动求导)
- [3.5 保存和加载模型](#3.5 保存和加载模型)
1. PyTorch 介绍
PyTorch 是一个开源的深度学习框架,由 Facebook 的人工智能研究团队开发和维护。它提供了丰富的工具和接口,用于构建和训练神经网络模型。PyTorch 被广泛应用于各种机器学习和深度学习任务,包括图像分类、目标检测、语义分割、自然语言处理、强化学习等。
PyTorch 具备:
- 动态计算图(Dynamic Computational Graph):
PyTorch 使用动态计算图的方式进行模型构建和计算。与静态计算图相比(如 TensorFlow),动态计算图更加灵活,允许用户在运行时动态地定义、修改和执行计算图。这使得 PyTorch 在实验和原型开发时更加方便,同时也更容易进行调试和可视化。 - 易于使用的接口:
PyTorch 提供了简洁清晰的 Python 接口,使得用户可以以自然的方式构建神经网络模型。其接口设计和功能组织清晰,易于理解和使用,适合从初学者到专家的各种技能水平的开发者。 - 自动求导(Automatic Differentiation):
PyTorch 的 autograd 模块实现了自动求导功能,可以根据输入和模型参数自动计算损失函数相对于参数的梯度。这简化了模型训练过程中梯度计算的操作,同时也支持高阶导数计算和动态计算图。 - 强大的 GPU 加速支持:
PyTorch 提供了对 GPU 的原生支持,可以利用 GPU 的并行计算能力加速神经网络模型的训练和推理过程。用户可以通过简单的配置,将计算任务分配给 GPU 执行,从而显著提高计算效率。 - 活跃的社区和生态系统:
PyTorch 拥有一个庞大而活跃的开发者社区,提供了丰富的教程、文档、示例代码和第三方库,使得用户可以快速入门和解决实际问题。此外,PyTorch 生态系统也在不断发展,涵盖了模型库、工具集、扩展库等丰富的资源。
Pytorch 的官方 API 介绍看这里
2. 张量基本操作
2.1 创建张量
torch.tensor(data)
:从给定的数据创建一个张量。torch.zeros(shape)
或torch.ones(shape)
:创建全零或全一的张量。torch.arange(start, end, step)
:创建一个从start
到end
步长为step
的张量。torch.randn(*size)
或torch.normal(mean, std, size)
:创建服从正态分布的随机张量。
python
import torch
# 从列表创建一个张量
data = [1., 2., 3., 4.]
t = torch.tensor(data)
print(t)
# 创建一个全零的2x3张量
zeros_tensor = torch.zeros(2, 3)
print(zeros_tensor)
# 创建一个服从均值为0,标准差为1的随机张量
random_tensor = torch.randn(2, 2)
print(random_tensor)
bash
tensor([1., 2., 3., 4.])
tensor([[0., 0., 0.],
[0., 0., 0.]])
tensor([[-1.1218, -0.5705],
[-1.6551, -0.1511]])
2.2 重塑张量
torch.reshape(tensor, shape)
或tensor.reshape(shape)
:改变张量的形状,但不改变元素总数。torch.view(tensor, shape)
或tensor.view(shape)
:类似reshape
,但在可能的情况下会共享内存。torch.Tensor.permute(dim0, dim1, ...)
或tensor.permute(...)
:按照指定顺序重新排列维度。torch.transpose(tensor, dim0, dim1)
或tensor.t()
:交换张量的两个维度。
python
# 创建一个1D张量并将其重塑为2D张量
t = torch.tensor([1, 2, 3, 4])
reshaped_t = t.reshape(2, 2)
print(reshaped_t)
# 重新排列张量的维度
t = torch.randn(2, 3, 4)
print(t)
transposed_t = t.permute(2, 0, 1)
print(transposed_t)
bash
tensor([[1, 2],
[3, 4]])
tensor([[[-0.1610, 1.0187, 1.5717, -0.2264],
[ 0.9088, -0.1546, -0.2941, 1.5809],
[-0.3500, -0.0128, -2.0361, -0.7662]],
[[-0.2943, 0.2772, 0.0761, -1.0888],
[ 0.5634, -0.8135, -1.6208, -1.6874],
[ 1.3876, 0.8068, 1.7220, -0.6855]]])
tensor([[[-0.1610, 0.9088, -0.3500],
[-0.2943, 0.5634, 1.3876]],
[[ 1.0187, -0.1546, -0.0128],
[ 0.2772, -0.8135, 0.8068]],
[[ 1.5717, -0.2941, -2.0361],
[ 0.0761, -1.6208, 1.7220]],
[[-0.2264, 1.5809, -0.7662],
[-1.0888, -1.6874, -0.6855]]])
2.3 索引和切片
tensor[indexing]
:通过标准Python索引规则访问或修改张量的部分元素。tensor[:, :, ...]
:用于多维索引。
python
# 切片操作
t = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
slice_t = t[1:, 1:]
print(slice_t)
bash
tensor([[5, 6],
[8, 9]])
2.4 数据类型转换
tensor.to(device)
:将张量移动到特定设备(CPU或GPU)。tensor.numpy()
:将张量转换为NumPy数组。torch.tensor(numpy_array)
:将NumPy数组转换为张量。
python
import numpy as np
# 张量与NumPy数组互转
numpy_array = np.array([1, 2, 3])
tensor = torch.from_numpy(numpy_array)
back_to_numpy = tensor.numpy()
print(back_to_numpy)
bash
[1 2 3]
3.深度学习相关的操作
3.1损失函数
torch.nn.CrossEntropyLoss()
:用于多类分类问题,通常不需要对标签进行one-hot编码。
3.2 层和模型
nn.Linear(in_features, out_features)
:定义线性层。nn.LSTM(input_size, hidden_size, num_layers, ...)
:定义长短时记忆(LSTM)循环神经网络层。
3.3 优化器
torch.optim.SGD(model.parameters(), lr)
:定义使用随机梯度下降优化模型参数的优化器。optimizer.step()
:执行一次优化步骤来更新模型参数。optimizer.zero_grad()
:清零优化器中所有参数的梯度。
3.4 自动求导
x.requires_grad_(True)
:开启张量的自动求导追踪。y.backward()
:计算张量y
关于其依赖项的梯度。
3.5 保存和加载模型
torch.save(model.state_dict(), 'model.pth')
:保存模型权重。model.load_state_dict(torch.load('model.pth'))
:加载模型权重。