PyTorch.md 16 KB

PyTorch介绍

PyTorch是一个由Facebook开源的深度学习框架,以其简洁易用、功能强大而著称。它广泛用于计算机视觉、自然语言处理等领域,是深度学习入门的首选框架之一。PyTorch的基本功能涵盖了构建和训练神经网络的所有操作,包括张量运算、自动微分、神经网络模块、数据集、优化器、GPU支持等。以下是对PyTorch的详细介绍:

  • 核心特性

    • 简洁易用:PyTorch的设计追求最少的封装,代码简洁直观,易于理解和使用。
    • 动态计算图:与TensorFlow的静态计算图不同,PyTorch的计算图是动态的,可以根据计算需要实时改变计算图,这使得调试和优化模型变得更加方便。
    • 丰富的库支持:PyTorch提供了Torchvision(用于图像处理)、Torchtext(用于文本处理)和Torchaudio(用于音频处理)等扩展库,可以帮助用户快速实现复杂任务。
    • 强大的GPU支持:PyTorch完全支持GPU加速,可以显著提高计算效率。
    • 活跃的社区:PyTorch拥有庞大的用户社区和丰富的文档资源,用户可以在社区中获取帮助和支持。
  • 主要模块

    • torch:PyTorch的核心模块,提供了张量运算、随机数生成等基本功能。
    • torch.autograd:自动微分模块,支持自动计算梯度,主要用于神经网络的反向传播。
    • torch.nn:神经网络模块,提供了各种神经网络层、激活函数、损失函数等。
    • torch.optim:优化模块,提供多种优化算法如SGD、Adam等,用于神经网络的训练和优化。
    • torch.utils.data:数据处理模块,包含Dataset和DataLoader等类,用于处理数据集并进行批量加载。
    • torch.cuda:GPU支持模块,提供与GPU相关的操作。
  • 应用场景

    • 计算机视觉:如图像分类、目标检测、图像分割等。

基于计算机视觉的端到端交通路口智能监控系统

基于计算机视觉的端到端交通路口智能监控系统

  • 自然语言处理:如文本分类、机器翻译、情感分析等。
  • 音频处理:如语音识别、音频分类等。
  • 推荐系统:根据用户的历史行为和偏好推荐产品或内容。
  • 增强学习:通过与环境交互来学习策略。

  • 医学AI

    1) 3D-CT影像的肺结节检测(LUNA16数据集)

2)基于U-net的医学影像分割 / pytorch实现

基于U-net的医学影像分割 / pytorch实现

3)基于深度学习的肿瘤辅助诊断系统 基于深度学习的肿瘤辅助诊断系统

可以将PyTorch和YOLO的关系比喻为“厨房与厨师的关系”。

  • PyTorch(厨房)

    • 角色:PyTorch是一个深度学习框架,就像是一个设备齐全、功能强大的厨房。它为深度学习模型的开发提供了各种必要的工具、函数和库,就像厨房提供了各种烹饪所需的设备、食材和调料。
    • 特点:厨房(PyTorch)具有高度的灵活性和可扩展性,厨师(开发者)可以根据自己的需求选择使用哪些设备、食材和调料,来制作各种美食(深度学习模型)。
  • YOLO(厨师)

    • 角色:YOLO是一种目标检测算法,就像是一位经验丰富的厨师。它利用PyTorch(厨房)提供的各种工具和资源,来制作出一道道美味的佳肴(实现目标检测任务)。
    • 特点:厨师(YOLO)擅长快速、准确地完成任务,就像YOLO算法能够在实时场景下快速准确地检测出图像中的目标物体。同时,厨师(YOLO)还可以根据自己的经验和技巧,对食材和调料进行巧妙的搭配,制作出独具特色的美食(对目标检测算法进行优化和改进)。

总结:PyTorch和YOLO之间的关系,就像是一个设备齐全、功能强大的厨房与一位经验丰富的厨师之间的关系。厨房(PyTorch)提供了必要的工具和资源,而厨师(YOLO)则利用这些工具和资源,发挥自己的经验和技巧,来制作出一道道美味的佳肴(实现高效的目标检测任务)。

如何快速掌握PyTorch

要快速掌握PyTorch,可以按照以下步骤进行:

  • 学习基本概念

    • 了解PyTorch的基本概念,如张量、计算图、自动微分、神经网络模块等。
    • 理解PyTorch的工作流程和计算模型。
  • 安装PyTorch

    • 访问PyTorch官方网站(https://pytorch.org/),根据你的操作系统和硬件环境选择合适的安装方式。
    • 通常可以使用pip或conda来安装PyTorch。安装完成后,通过简单的测试代码来验证安装是否成功。
  • 学习PyTorch API

    • 熟悉PyTorch的核心模块和常用函数,如torch.Tensor、torch.nn.Module、torch.optim等。
    • 阅读官方文档和教程,了解每个模块和函数的具体用法和示例代码。
  • 实践基础操作

    • 尝试创建和操作张量,进行基本的数学运算。
    • 构建简单的神经网络模型,如全连接层网络。
    • 使用PyTorch提供的数据集和DataLoader进行数据的加载和预处理。
    • 编写训练循环,使用优化器对模型进行训练。
  • 完成实战项目

    • 选择一个感兴趣的实战项目,如使用PyTorch进行手写数字识别或文本分类等任务。
    • 通过实战项目来加深对PyTorch的理解和掌握,同时锻炼解决问题的能力。
  • 参与社区交流

    • 加入PyTorch社区,与其他开发者交流学习心得和经验。
    • 关注PyTorch的官方论坛、GitHub仓库和社交媒体账号,及时获取最新动态和教程。
  • 持续学习和实践

    • 深度学习是一个快速发展的领域,新的算法和技术层出不穷。
    • 保持持续学习的态度,关注最新的研究进展和行业动态。
    • 通过不断的实践来巩固所学知识,提高解决问题的能力。

PyTorch 入门手册 一、简介 PyTorch 是一个基于 Python 的科学计算包,主要用于深度学习。它提供了张量计算、自动求导以及构建和训练神经网络的功能。由于其简洁性、灵活性和强大的 GPU 加速能力,PyTorch 在学术界和工业界都得到了广泛应用。 二、安装 (一)环境准备 Python:确保你已经安装了 Python,建议使用 Python 3.6 及以上版本。 包管理器:可以使用 pip 或 conda 来安装 PyTorch。 (二)安装步骤 pip 安装: CPU 版本:如果你的计算机没有 NVIDIA GPU,可以使用以下命令安装 CPU 版本的 PyTorch: pip install torch torchvision torchaudio

GPU 版本:如果你的计算机有 NVIDIA GPU,并且已经安装了相应的 CUDA 驱动和 cuDNN 库,可以根据 CUDA 版本选择对应的安装命令。例如,对于 CUDA 11.3,可以使用以下命令: pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio==0.10.0+cu113 -f https://download.pytorch.org/wholesale/torch_stable.html

conda 安装: CPU 版本: conda install pytorch torchvision torchaudio cpuonly -c pytorch

GPU 版本: conda install pytorch torchvision torchaudio cuda11.3 -c pytorch

具体的 CUDA 版本和命令可以在 PyTorch 官方网站(https://pytorch.org/get-started/locally/)查询。 三、基础概念 (一)张量(Tensor) 定义:张量是 PyTorch 中最基本的数据结构,类似于 Numpy 的 ndarray,但可以在 GPU 上进行计算。张量可以表示标量、向量、矩阵以及更高维的数据。 创建张量: 直接创建: import torch

创建一个标量张量

scalar = torch.tensor(5)

创建一个向量张量

vector = torch.tensor([1, 2, 3])

创建一个矩阵张量

matrix = torch.tensor([[1, 2], [3, 4]])

从 Numpy 数组创建: import numpy as np arr = np.array([[1, 2], [3, 4]]) tensor_from_np = torch.from_numpy(arr)

创建特殊张量:

创建全零张量

zeros = torch.zeros((2, 3))

创建全一张量

ones = torch.ones((3, 2))

创建随机张量

random = torch.rand((2, 2))

张量操作: 索引和切片:张量的索引和切片操作与 Numpy 数组类似。 matrix = torch.tensor([[1, 2], [3, 4]])

取第一行

row1 = matrix[0]

取第一列

col1 = matrix[:, 0]

算术运算:张量支持各种算术运算,如加、减、乘、除等。 a = torch.tensor([1, 2]) b = torch.tensor([3, 4]) c = a + b d = a * b

矩阵运算: a = torch.tensor([[1, 2], [3, 4]]) b = torch.tensor([[5, 6], [7, 8]]) c = torch.mm(a, b)

维度变换: matrix = torch.tensor([[1, 2], [3, 4]])

转置矩阵

transposed = matrix.t()

改变形状

reshaped = matrix.view(4)

(二)自动求导(Autograd) 原理:PyTorch 的自动求导机制允许我们自动计算张量的梯度。通过创建具有requires_grad=True的张量,PyTorch 会自动记录对该张量的所有操作,并在需要时计算梯度。 示例: x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True) y = x * 2 z = y.mean() z.backward() print(x.grad)

在这个例子中,我们首先创建了一个需要求导的张量x,然后对x进行了乘法和均值运算得到z,最后调用z.backward()计算z关于x的梯度。 (三)神经网络(Neural Network) 定义:在 PyTorch 中,可以通过继承torch.nn.Module类来定义神经网络。 构建简单神经网络: import torch.nn as nn import torch.nn.functional as F

class SimpleNet(nnn.Module):

def __init__(self):
    super(SimpleNet, self).__init__()
    self.fc1 = nn.Linear(10, 20)
    self.fc2 = nn.Linear(20, 2)

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

在这个例子中,我们定义了一个简单的神经网络SimpleNet,它包含两个全连接层,输入维度为 10,输出维度为 2。forward方法定义了网络的前向传播过程。 四、数据加载与预处理 (一)数据加载 Dataset 类:PyTorch 提供了torch.utils.data.Dataset类作为所有数据集的基类。要使用自定义数据集,需要继承Dataset类并实现lengetitem方法。 from torch.utils.data import Dataset

class MyDataset(Dataset):

def __init__(self, data, labels):
    self.data = data
    self.labels = labels

def __len__(self):
    return len(self.data)

def __getitem__(self, idx):
    return self.data[idx], self.labels[idx]

DataLoader 类:torch.utils.data.DataLoader类用于将数据集包装成可迭代的对象,方便进行批量训练。 from torch.utils.data import DataLoader

dataset = MyDataset(data, labels) loader = DataLoader(dataset, batch_size = 32, shuffle = true)

在这个例子中,我们将MyDataset包装成DataLoader,设置批量大小为 32,并在每个 epoch 中打乱数据。 (二)数据预处理 常见预处理操作:常见的数据预处理操作包括标准化、归一化、数据增强等。 from torchvision import transforms

transform = transforms.Compose([

transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))

])

在这个例子中,我们使用torchvision.transforms对图像数据进行预处理,首先将图像转换为张量,然后进行标准化。 五、模型训练与评估 (一)训练循环 设置训练参数: import torch.optim as optim

model = SimpleNet() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr = 0.01)

在这个例子中,我们创建了一个SimpleNet模型,使用交叉熵损失函数和随机梯度下降优化器。

  1. 训练循环: for epoch in range(10): for inputs, labels in loader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() print(f'Epoch {epoch + 1}, Loss: {loss.item()}')

在这个例子中,我们进行了 10 个 epoch 的训练,在每个 epoch 中,遍历数据加载器,进行前向传播、计算损失、反向传播和优化器更新。 (二)模型评估 评估模式:在评估模型时,需要将模型设置为评估模式,以关闭一些训练时的操作,如 dropout 和批量归一化。 model.eval()

评估指标:常见的评估指标包括准确率、召回率、F1 值等。 correct = 0 total = 0 with torch.no_grad():

for inputs, labels in loader:
    outputs = model(inputs)
    _, predicted = torch.max(outputs.data, 1)
    total = total + labels.size(0)
    correct = correct + (predicted == labels).sum().item()

accuracy = correct / total print(f'Accuracy: {accuracy}')

在这个例子中,我们计算了模型在测试集上的准确率。 六、保存与加载模型 (一)保存模型 保存整个模型: torch.save(model, 'model.pth')

保存模型参数: torch.save(model.parameters(), 'params.pth')

(二)加载模型 加载整个模型: loaded_model = torch.load('model.pth')

加载模型参数: model = SimpleNet() model.load_state_dict(torch.load('params.pth'))

七、案例实战:手写数字识别 (一)数据集准备 MNIST 数据集:我们使用 MNIST 数据集,它包含手写数字的图像和标签。 from torchvision import datasets, transforms

train_dataset = datasets.MNIST(root = './data', train = true, download = true, transform = transform) test_dataset = datasets.MNIST(root = './data', train = false, download = true, transform = transform)

数据加载器: train_loader = DataLoader(train_dataset, batch_size = 64, shuffle = true) test_loader = DataLoader(test_dataset, batch_size = 128, shuffle = false)

(二)模型定义 定义神经网络: class MNISTNet(nnn.Module):

def __init__(self):
    super(MNISTNet, self).__init__()
    self.conv1 = nn.Conv2d(1, 16, kernel_size = 3)
    self.conv2 = nn.Conv2d(16, 32, kernel_size = 3)
    self.fc1 = nn.Linear(32 * 5 * 5, 128)
    self.fc2 = nn.Linear(128, 10)

def forward(self, x):
    x = F.relu(self.conv1(x))
    x = F.max_pool2d(x, 2)
    x = F.relu(self.conv2(x))
    x = F.max_pool2d(x, 2)
    x = x.view(-1, 32 * 5 * 5)
    x = F.relu(self.fc1(x))
    x = self.fc2(x)
    return x

(三)模型训练与评估 训练模型: model = MNISTNet() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr = 0.001)

for epoch in range(10):

for inputs, labels in train_loader:
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()
print(f'Epoch {epoch + 1}, Loss: {loss.item()}')

评估模型: model.eval() correct = 0 total = 0 with torch.no_grad():

for inputs, labels in test_loader:
    outputs = model(inputs)
    _, predicted = torch.max(outputs.data, 1)
    total = total + labels.size(0)
    correct = correct + (predicted == labels).sum().item()

accuracy = correct / total print(f'Accuracy: {accuracy}')

八、总结 通过本手册,你学习了 PyTorch 的基础概念、安装方法、数据加载与预处理、模型训练与评估、模型保存与加载以及一个简单的手写数字识别案例。PyTorch 提供了丰富的功能和工具,帮助你构建和训练深度学习模型。在实际应用中,你可以根据具体需求进行调整和优化。如果你对某些部分还有疑问,建议参考 PyTorch 的官方文档(https://pytorch.org/docs/stable/),以获取更详细的信息。

资源

pytorch-cpp C++的PyTorch

更新的框架 优化后的pytorch

1) 基于pytorch的框架 pytorch-lightning

基于pytorch的框架 pytorch-lightning

最好的学习方法就是干项目

1)基于深度学习算法的电力负载分类与预测系统

基于深度学习算法的电力负载分类与预测系统

2) 基于tensorflow、keras/pytorch实现对自然场景的文字检测及端到端的OCR中文文字识别

端到端的OCR中文文字识别