Copyright: Jingmin Wei, Pattern Recognition and Intelligent System, School of Artificial and Intelligence, Huazhong University of Science and Technology
本教程不商用,仅供学习和参考交流使用,如需转载,请联系本人。
本教程为 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 安装。非常不推荐廖老师的教程里的安装方式,如果你只安装一个 Python 解释器,那么你需要用很多次 pip 命令一个一个安装管理需要的库,而且解释器自带的 IDLE 写起代码来非常不方便。 我们一般使用的是 Anaconda3 科学计算环境 + VSCode / Pycharm IDE 。Anaconda内置了很多常用库和 Jupyter Notebook ,而现代的 IDE 会让代码的书写更加的方便和漂亮。
Jupyter Notebook 是一个交互式的 python 编程环境,文件后缀为.ipynb。它支持 cell 编程方式,支持 Markdown 语法,支持多种文件格式导出。非常适合用来保存网络的训练预测结果,边写代码边做笔记,和随时随地的 debug 。第一次用 cell 可能会不太习惯,一旦上手你会发现它非常非常好用。
Python 基础。可以看廖老师的教程。一般三天内即可入门,学完面向对象编程那一章节即可。面向对象部分重点提一下,如果你有 C++/JAVA 等面向对象语言基础,那么 Python 的面向对象其实也就是举一反三的事。如果你没有的话,一定要去学习一下,因为我们的网络搭建多数采用的是类继承 nn.Module 的方法。
数据处理和可视化基础。推荐北理的慕课。很多 Python 的科学计算和机器学习库是边用边学的,掌握基本的原理后,其他的方法只需在使用的时候查阅资料,了解相关参数和使用方式即可。但是有几个库推荐大家一定要系统学习一下:numpy, matplotlib, pandas, re. 这几个库上手难度因人而异。如果你在 C/C++/JAVA 等语言中,系统学习过数组,那么numpy 你可以轻松掌握;如果你有 matlab 的绘图经验,那么 matplotlib 你能轻松上手;如果你有 sql/excel 等数据管理经验,pandas 对你而言轻而易举;如果你学习过正则表达式,那么 re 也不是问题。
上面说的几个库是一些数据处理和科学计算的核心库,大家在学习 Pytorch 的过程中,会看到代码中有很多调用上面的库,来实现一些数据处理和运算的过程。为了方便大家的学习,这些库提前学习一下会更好。
机器学习基础。必须要指出的是,这个教程是针对于深度学习(Pytorch 神经网络框架),相信阅读这个教程的你们,都有一定的机器学习基础。如果没有的话,可以自己去阅读西瓜书,统计机器学习等,看一些网课视频,实现一些相关算法。或者跟着 scikit-learn 官方教程学习和快速入门。scikit-learn 也有很多人翻译过教程中文版,我自己用的是这个网站。
本教程主要参考并引用了如下资料:
详细的参考资料,论文在对应的各个教程部分都已经列出链接,大家打开相关链接前记得科学上网。
本教程主要使用了如下数据集:
Python 解释器:推荐 Anaconda3 。安装成功后,其 base 环境默认内置了很多科学计算库,不需要 pip / conda 一个个安装。但是 Pytorch 框架是是需要用包管理工具自己安装的。计算机磁盘不够可以考虑 Mini-Conda 。
开发工具:VSCode / Pycharm 。推荐在 VSCode 下安装 Jupyter Notebook 插件,或者直接使用 Anaconda 自带的 Jupyter Notebook。不推荐使用 Pycharm 进行代码学习。
操作系统:Linux / Windows 皆可。Linux 系统需要一定的命令基础,相关教程我之后有空再上传吧。
相关库:pytorch, torchvision, torchtext , torchsummary, torchviz, numpy, matplotlib, pandas, opencv-python, pillow, scikit-learn, scipy, cvxopt, nltk, re, requests, wordcloud, seaborn, hiddenlayer, os, time, copy 等等。
硬件:电脑最好是有 N 卡,支持 CUDA 驱动。一些较为复杂的网络,CPU 是无法跑出一个好结果的,且非常的慢。如果没有 GPU,可以去租云服务器,或者使用 Google Colab 等等。
请按需自行搜索相关教程:Anaconda3 安装,Anaconda3 + VSCode 环境配置;Anaconda3 + Pycharm 环境配置;Anaconda 安装 Pytorch;Jupyter Notebook 使用;Markdown 入门;LaTeX 数学公式;Conda 入门与环境管理;shell 常用文件管理命令;VSCode 下 Jupyter Notebook 插件安装; Pytorch 配置 GPU 相关教程。
相比起其他环境,配置 Pytorch 开发环境其实很简单的。只要你有 Python 基础,和 Anaconda 环境配置经验,那么这一部分你可以轻松实现。
上个部分列举的大部分相关库是 Anaconda 已经预装好的,只有小部分库(torch, opencv, nltk, requests, wordcloud…)需要自己装。如果代码报错 ‘no module named …’ 的时候用 conda install … 命令安装即可。安装太慢可以使用国内镜像源,或者科学上网。在 conda 环境里添加包和第三方库还有一些操作,需要自学一点 conda 和 shell 相关命令。
一般挂加速器后,在 conda 的 prompt 控制台输入命令( prompt 的位置:下载 Anaconda 后,在开始菜单最近添加里,有它的启动图标,可以添加进磁贴里方便快速打开)。
或者打开命令提示符 win+r ,然后框内输入 cmd ,按下回车,然后输入指令进行一些电脑文件的操作。
如果你没有加速器,也可以选择使用清华镜像源来安装一些第三方库。如何使用镜像,可以自己上网查。
# package_name为你需要安装的python库名字
conda install package_name
一些库如果不存在对应的 conda 版本,这时候我们就需要 pip 安装标准版本的:
pip3 install package_name
或者:
pip install package_name
GPU 版本的 Pytorch 可以比普通版本(CPU) 快上 80% ,它对于卷积层有 5 种并行计算的加速方式。使用 GPU 训练的神经网络,优化结果更好,精度更高。 具体的效率和精度可能会因 GPU 而异。使用 GPU 版本的 Pytorch 需要支持 CUDA 驱动的独立显卡,一般为 N 卡(英伟达系列)。
Pytorch 官网提供了不同版本的 Pytorch 安装命令,大家按需自取。默认方式只会安装最新的稳定版 Pytorch 版本。
Pytorch 的 CPU 版本安装:
# 以cpu版本为例,在conda终端输入命令即可
conda install pytorch
conda install torchvision
conda install torchtext
或者一次性安装:
conda install pytorch torchvision torchtext
下载过慢请用其他镜像源,或者科学上网。
Pytorch 的 GPU 版本安装:
# 以10.2版本为例
conda install pytorch torchvision torchtext cudatoolkit=10.2 -c pytorch
安装后是不是就可以用 GPU 了呢?
并非如此,还需要配置 CUDA + CUDNN 的驱动支持,这一部分比较麻烦,后续的 Pytorch GPU 版本安装请自行搜索资料。
环境测试代码:
import torch.nn as nn
from torchvision import transforms
这一章节的余下部分我们将讲一些 GPU 相关的代码。不支持 CUDA 的,或者没有配置 GPU 的请跳过这章的剩余部分。`
# 导入相关库
import torch
import torch.nn as nn
torch.cuda.is_available()
True
输出版本号
print(torch.__version__)
print(torch.version.cuda)
print(torch.backends.cudnn.version())
1.8.1
10.1
7604
定义 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 。
X = X.to(device) # device为你自己指定的设备
y = torch.tensor([1, 2, 3], dtype=torch.float64)
y.to(device)
tensor([1., 2., 3.], device='cuda:0', dtype=torch.float64)
3. 如果不想指定 device,也可以用如下代码将数据和模型在不同设备上切换。
X_train = X_train.cuda() # GPU
X_train = X_train.cpu() # CPU
4. 以下代码说明,在深度学习代码框架中,什么时候需要将数据和模型 push 到 GPU 上。
如果你指定了device = torch.device("cuda")
,注释掉的代码和源代码等价。
# 模型放到GPU上
my_net = my_net().to(device)
# my_net = my_net().cuda()
# 定义损失函数需要放到GPU上
loss_func = nn.CrossEntropyLoss().to(device)
# loss_func = nn.CrossEntropyLoss().cuda()
# 训练过程中
for step, (X_train, y_label) in enumerate(data_loader):
X_train, y_label = X_train.to(device), y_label.to(device)
# X_train, y_label = X_train.cuda(), y_label.cuda()
...
# 对数据进行预测后,需要用numpy/matplotlib处理
y_pred = my_net(X_val).cpu()
如果你的设备有多个 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 上。