Pytorch:入门指南和 GPU 计算

Pytorch:入门指南和 GPU 计算,第1张

Pytorch:入门指南和 GPU 计算 Pytorch: 入门指南和 GPU 计算

Copyright: Jingmin Wei, Pattern Recognition and Intelligent System, School of Artificial and Intelligence, Huazhong University of Science and Technology


文章目录

Pytorch: 入门指南和 GPU 计算 @[toc]

教程前言

概览基础知识要求Reference Pytorch 安装和使用判断 GPU 是否可用和版本号使用GPU指定 GPU

本教程不商用,仅供学习和参考交流使用,如需转载,请联系本人。

教程前言

本教程为 Pytorch 入门到精通教程。

概览

第一阶段: 我们将介绍一些基础知识,从最简单的张量 *** 作开始,一步步深入:核心模块 torch.nn 与 *** 作算子,数据预处理与数据加载器构建,损失函数,优化器,网络模型搭建,网络参数计算,深度神经网络搭建框架与搭建实例。

在这一部分,我们将学习到:

实现高维矩阵的计算,索引,变换,变量的自动微分。

卷积,池化,全连接,循环,BN,GN,Dropout 等核心网络层的算法原理和实现方式。ReLU 及其变种, Softplus, Softmax 等常用的 Activation Function。感受野和空洞卷积相关理论。

交叉熵,均方误差等损失函数,SGD, Adam 等常用的经典优化器。

不同的数据增强方式,文字和图像数据的预处理和可视化。学习处理 IRIS鸢尾花,波士顿房价,Fashion-MNIST,IMDB 等常用数据集。

学习如何计算网络的卷积,池化,全连接层的参数,根据要求计算并搭建不同的神经网络。

第二阶段: 我们将介绍全连接神经网络和任务实现:

学习多层感知机(全连接网络),实现基础的分类和回归任务。通过全连接神经网络实现垃圾邮件分类,波士顿房价预测。

第三阶段: 我们将学习不同的 CNN 的结构和原理。从这一部分开始,建议大家结合论文原文理解代码。这也是整个教程的核心部分。

学习卷积网络的基本构成,并搭建简单的网络实现 Fashion-MNIST 的识别。

利用爬虫爬取数据集,利用预训练的 VGG 网络在 ImageNet 上进行分类任务的分析。

微调预训练的网络实现猴子,猫狗分类等任务。

重难点:学习诸如 LeNet, AlexNet, NiN, VGG, GooLeNet, ResNet, DenseNet 的经典卷积网络模型。深入理解网络背后的结构,核心思想,优化理论,并用代码对论文中的网络结构进行复现。

第四阶段: 学习不同的循环神经网络,LSTM 和 GRU 。学习文本预处理的方法,并搭建 RNN ,实现文本分类和情感预测等自然语言处理任务。

第五阶段: 更加细化的学习一些经典算法和任务:

图像风格迁移,自编码器,图像语义分割,图卷积神经网络,图像目标检测与跟踪。

我们将用一些经典网络比如说 VGG19 ,实现图像风格迁移,图像语义分割等任务,感受现在很多流行的图像软件中,核心算法的魅力。

我们将用神经网络实现自编码器 Auto-encoder,对数据降维分析,并对比 PCA 的效果。

我们将学习半监督实现的图卷积神经网络,并对比 LP 的效果。

我们将学习 FCN, U-Net, SegNet 等经典的语义分割网络,并实现相关的图像语义分割任务。

我们也将探索 Faster R-CNN, SSD, YOLO 等目标检测网络框架的魅力。

第六阶段,还没想好。 虽然深度强化学习,对抗学习等自己也有相关笔记的教程参考,但是都是 tensorflow 写的,之后有时间再补上吧。然后一些其他的,比如说集成学习算法优化等等,也可以写在这一部分。一些轻量网络也可以作为拓展写在这,这是后话了

本教程不会详细地说明每一个使用方法的数学推导。 比如说,本教程不会着重告诉你,激活函数怎么来的?损失函数(比如说 Logistic )的梯度怎么推导?随机梯度下降法是怎么一回事?遇到相关概念,不明确的请自行查阅相关资料。

本教程侧重点为:通过实战,解决不同的分类回归问题;如何计算网络参数,搭建不同的网络模型;一些经典的神经网络模型和算法的代码实现;模型可视化,网络特征提取和可视化,结果可视化;模型的精度与损失的分析;一些经典的深度学习任务实现:数据回归预测,图像识别,文字分类,情感分析,风格迁移,语义分割,目标检测,对抗学习,自编码降维,图卷积等等。

基础知识要求

如果没有以下某些基础的也不必担心,你可以直接看代码,在学代码写代码的同时,遇到相关问题,去搜索查阅相关即可。基础知识都不是太难理解,一旦入门,就足以攻克 Pytorch 所需要的数学知识部分。

本教程阅读前需要读者掌握一定的基础知识:

高等数学,线性代数,概率论等数学基础。其中,矩阵运算,函数求导数,链式法则求梯度等相关数学知识是必要的。对于机器学习(监督学习,无监督学习,半监督学习),深度学习有一定的基本概念认识。python 语言基础,尤其是面向对象的基础。一定程度的 numpy, matplotlib, pandas 的使用经验和数据处理基础。了解梯度下降法及其变种,了解损失函数(交叉熵,均方误差等)。接触过类似于感知器,线性回归,Logistic 回归,SVM 等机器学习的基础算法。非必须:自己实现过,或者调用过 scikit-learn 实现一些分类或回归任务非必须:一定的信号与系统基础知识。对于卷积,池化,归一化等等有基本认识。非必须:一定的图像知识基础,了解彩色图,灰度图,二值图,通道相关概念。了解一些常用的图像增强,图像变换的算法。一定的自然语言处理基础,了解Word2Vec,停顿词等相关概念。 Reference

本教程主要参考了如下资料:

模式识别课件 - 神经网络部分Pytorch: 深度学习入门与实战深度学习之Pytorch物体检测实战动手学深度学习花书《Deep Learning》西瓜书《机器学习》相关网络和数据的源论文…自己的课堂和课后笔记

详细的参考资料和论文在对应的各个教程部分都已经列出链接,大家打开论文和博客链接前记得科学上网。

本教程主要使用了如下数据集:

10-monkey-speciesBoston House PriceCat vs DogCOCOFace EmotionFashion-MNISTImageNetIRISIMDBMNISTPASCAL VOCSpam baseTHUCNewsVOT… Pytorch 安装和使用

Python 解释器:推荐 Anaconda3 。安装成功后,其 base 环境默认内置了很多科学计算库,不需要 pip / conda 一个个安装。但是Pytorch是需要用包管理工具自己安装的。容量不够可以考虑 Mini-Conda。

开发工具:VSCode / Pycharm 。推荐在 VSCode 下安装 Jupyter Notebook 插件,或者直接使用 Anaconda 自带的 Jupyter Notebook。不推荐使用 Pycharm 学习。

*** 作系统:Linux / Windows 皆可。Linux 系统需要一定的命令基础,这个我之后有空再上传吧。

库:pytorch, torchvision, torchsummary, torchviz, numpy, matplotlib, pandas, opencv-python, scikit-learn, seaborn, hiddenlayer, os, time, copy 等等。大部分库是预装好的,只有小部分库需要自己装,代码报错 ‘no module named …’ 的时候用 conda 安装即可。

硬件:电脑最好是有 N 卡,支持 CUDA 驱动。一些较为复杂的网络,CPU 是无法跑出一个好结果的,且非常的慢。如果没有 GPU,可以去租云服务器,或者使用 colab 等等。

请按需自行搜索相关教程:Anaconda3 + VSCode 环境配置;Anaconda3 + Pycharm 环境配置;Anaconda 安装 Pytorch;Jupyter Notebook 使用;Markdown 入门;LaTeX 数学公式;Conda 入门与环境管理;shell 常用文件管理命令;VSCode 下 Jupyter Notebook 插件安装; Pytorch 配置 GPU 相关教程。

相比起其他环境,配置 Pytorch 开发环境其实很简单的。只要你有 Python 基础,和 Anaconda 环境配置经验,那么这一部分你可以轻松实现。

# 以cpu版本为例,在conda终端输入命令即可
conda install pytorch
conda install torchvision

下载过慢请用其他镜像源,或者科学上网,Pytorch GPU 版本安装请自行搜索资料。

环境测试代码:

import torch.nn as nn
from torchvision import transforms

Jupyter Notebook 是一个交互式的 python 编程环境,使用文件后缀为.ipynb。支持 cell 编程方式,支持 Markdown 语法,支持多种文件格式导出。非常适合用来保存网络的训练预测结果,边写代码边做笔记,和随时随地的 debug 。第一次用 cell 可能会不太习惯,一旦上手你会发现它非常非常好用。

这一章节我们将讲一些 GPU 相关的代码。不支持 CUDA 的,或者没有配置 GPU 的请跳过这章的剩余部分。

# 导入相关库
import torch
import torch.nn as nn
判断 GPU 是否可用和版本号
torch.cuda.is_available()
True

输出版本号

print(torch.__version__)
print(torch.version.cuda)
print(torch.backends.cudnn.version())
1.8.1
10.1
7604
使用GPU

定义 device :

# import os
# os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

# apply GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# device = torch.device('cpu')
print(device)
cuda

输出设备个数和版本号

print(torch.cuda.device_count())
print(torch.cuda.get_device_name(0))
1
GeForce MX250

1. 可用如下代码在数据建立时就指定 device.

X = torch.randn(3, 3, device=device, requires_grad=True)
X
tensor([[ 0.8280,  1.6671,  0.3400],
        [ 0.1082,  0.1605,  1.4127],
        [ 0.7233, -1.4746,  1.2668]], device='cuda:0', requires_grad=True)

2. 如果指定了 device 为 GPU ,可以用如下代码将数据和模型 push 到 GPU 上。否则默认为 CPU 。

y = torch.tensor([1, 2, 3], dtype=torch.float64)
y.to(device)
tensor([1., 2., 3.], device='cuda:0', dtype=torch.float64)

3. 可以用如下代码将数据和模型在不同设备上切换。

X_train = X_train.cuda() # GPU
X_train = X_train.cpu() # CPU
X_train = X_train.to(device) # device为你自己指定的设备

以下代码说明,在深度学习代码框架中,什么时候需要将数据和模型 push 到 GPU 上。

# 模型放到GPU上
my_net = my_net().to(device)

# 定义损失函数需要放到GPU上
loss_func = nn.CrossEntropyLoss().to(device)   

# 使用模型,对数据进行训练和预测
y = my_net.to(device)

for step, batch in enumerate(data_loader):
    X_train, y_label = X_train.to(device), y_label.to(device)
    ...
指定 GPU

1.终端直接指定

CUDA_VISIBLE_DEVICES=2 python3 xxx.py

2.在脚本中用函数指定

torch.cuda.set_device(1)

处理多 GPU 并行计算

model_gpu = nn.DataParallel(my_net, device_ids=[0, 1])
output = model_gpu(input)

首先将模型加载到主 GPU 上,然后复制模型到各个指定的 GPU 上,将输入数据按 batch 维度进行划分,分配到每个 GPU 上独立前向传播,然后反向传播更新单个 GPU 的参数,最后将更新后的参数复制到各个 GPU 上。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5721222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存