深度学习框架:
图片来自网络
- 不必多说,深度学习爱好者入门首先接触的就是深度学习框架了,Pytorch作为目前最流行的深度学习框架,不论是在其性能还是简洁性上都是目前最适合入门学习的一个框架。
Linux基础:
熟悉开发环境是进行开发的首要工作,在Linux环境下开发在深度学习中是最为流行的,尽管Windows开发也很不错,但考虑企业和院所实际开发环境,掌握必备的Linux基础是必要的。
- Linux:Linux如同Windows,是一个免费使用(部分发行版)和自由传播的类UNIX操作系统。Linux操作系统知识量很庞大,作为深度学习开发者由浅入深,先从基本目录结构和环境变量开始就好。
- 目录结构:Linux的首要思想“一切皆文件”,数据和程序都以文件的形式存在和进行操作。Linux早已制定标准FHS结构,主要目录如下:①boot:操作系统启动目录通常不需要操作;②lib:库函数目录,协助系统程序执行;③bin:可执行文件目录,包含如ls、cat、mv等常用命令;④home:个人用户目录,大部分用户文件存在于此;⑤usr:应用程序安装目录,usr/lib存放不能直接运行但其他程序不可缺少的库,有时开发安装的包可以放在此目录,usr/local存放软件升级包,usr/share存放共享数据;⑥opt:额外安装的软件所在目录,如ros可执行文件。
- 环境变量:环境变量也就是操作系统执行程序时默认设定的参数,比如执行文件、库的路径。/etc/environment设置所有进程的环境变量,系统登录时读取的第一个文件。/etc/profile用于设置系统所有用户的环境变量,是系统登录时读取的第二个文件。
Python基础:
- 相信进行深度学习开发的朋友已具备一定编程基础,Python作为AI最热门的语言,以丰富的开源库和简洁的代码风格几乎贯穿了整个深度学习前后。
- Python语法简洁易懂,不作概述,开发学习过程中慢慢了解熟练即可。
Pytorch基础:
Pytorch属于动态图框架。动态图和静态图属于计算图的一种。计算图为描述计算的有向无环图(本节会详细描述)。
- 基本数据Tensor:tensor,即张量,是pytorch中基本操作对象。
- 标量:即单独数字;向量(矢量):即一排数,多行一列;矩阵:二维数组,多行多列;张量:即矩阵推广的概念。标量可视为零阶张量,向量为一阶张量,以此类推。
- tensor与numpy的ndarray数据类型相似,不同的是tensor方便于GPU类硬件加速。
- tensor有不同数据类型官方给出数种tensor数据类型(分CPU和GPU),训练和部署时可根据网络模型所需要的精度和显存大小选取。
- pytorch默认数据类型是32位浮点torch.FloatTensor,即torch.Tensor等同torch.FloatTensor。
- 详细tensor类型链接:https://blog.csdn.net/weixin_38664232/article/details/94192451
- tensor操作方法使用时再自行查阅即可。
- tensor广播机制:即两个不同形状的tensor进行计算操作时,可以自动扩展到较大的相同形状,前提是tensor至少有一个维度,且从尾部遍历tensor时,两者维度必须相等或其中一个要么是1或不存在。如下从后至前挨个比较,每个对应维度满足条件之一即可广播计算。
x = torch.empty(5, 3, 4, 1)
y = torch.empty( 3, 1, 1)
- tensor向量化操作:tensor向量化操作是指计算时不对元素挨个操作,是指在同一时间批量并行计算。
计算图:
深度学习神经网络即将矩阵参数和数据(图片、音频等)进行多层计算,从而求得最接近标签(真实)的一组参数的过程。以上个人理解。
Pytorch属于动态图框架。动态图和静态图属于计算图的一种。计算图为描述计算的有向无环图。tensor可以保证前向传播,想要完成神经网络训练,还需进行反向传播和梯度更新。pytorch提供了自动求导autograd,将前向传播过程记录成计算图,自动求导。
- 静态图与动态图:区别是是否在计算前先定义好神经网络结构也就是计算图。预先定义好静态图速度较快,但编写调试比较麻烦。动态图边执行边生成计算图,这样每次进入网络都需要生成一遍计算图,速度较慢。故可以考虑静态图优化加速。
- autograd:自动求导机制,记录tensor的操作,以便于自动求导和反向传播。通常通过requires_grad参数(默认为False)创建自动求导机制的tensor:
import torch
a= torch.randn(2,2,requires_grad=True)
- grad:tensor对应的梯度,类型为tensor。
- grad_fn:指向操作对象,即该对象经过了什么样的操作如c = a+b,则c.grad_fn类型为Add,初始tensor的grad_fn类型为None。
- detach():tensor.detach()函数可以用来获取数据,默认不求导。
- 计算图示例:
以上为实现wX+b = z的计算图,y为中间变量。x,w,b为用户自己创建的,都为叶节点。z为最终输出,是根节点。
- autograd的基本原理是随着每一步计算操作,逐渐生成计算图,并将操作方法记录在grand_fn中。前向传播(wX+b=z)计算完毕后,对根节点z进行反向传播梯度计算,从而得到w,X,b的对应梯度,梯度计算遵守链式法则。“正向传播”求损失,“反向传播”回传误差。同时,神经网络每层的每个神经元都可以根据误差信号修正每层的权重。