文章目录
深度学习简介
常规的系统功能仅用编程技巧即可实现。
对于一些仅用编程技巧无法解决的一些问题,比如识别猫。这类问题的解决关键在于图像理解,通过大量数据寻找同类数据的共有特征。
⽬前的机器学习和深度学习应⽤共同的核⼼思想:“⽤数据编程”。
机器学习是一门将不同的函数形式与大数据进行结合,利用大数据获取函数参数,解决实际问题的一门学科。研究如何使计算机系统利⽤经验改善性能。
深度学习是机器学习的一个分支,他的理论基础是神经网络。深度学习的形式通常是复杂的神经网络。深度学习是具有多级表示的表征学习⽅法。它可以逐级表示越来越抽象的概念或模式
深度学习起源
深度学习基于神经⽹络模型。核心思想是⽤数据编程。两者起源上个世纪。
大多神经网络的核心原则:
- 交替使⽤线性处理单元与非线性处理单元,它们经常被称为“层”
- 使用链式法则(即反向传播)来更新⽹络的参数。
深度学习发展
深度学习的发展一方面得益于计算力的提高;一方面得益于数据量增长,通过大量的数据寻找特征。
深度学习发展的部分原因:
- 优秀的容量控制方法,如丢弃法。
- 提出注意⼒机制,解决了在不增加参数的情况下扩展⼀个系统的记忆容量和复杂度。
- 记忆⽹络和神经编码器—解释器
- ⽣成对抗⽹络的发明
- 多GPU并行计算
- 深度学习框架
深度学习特点
- 端到端的训练。
- 含参数统计模型转向完全⽆参数的模型
- 对非最优解的包容
- 对非凸非线性优化的使⽤
- 勇于尝试没有被证明过的方法
深度学习模仿人脑结构利弊:
虽然深度学习从生命的生物机理中获得灵感,但它与大脑的实际工作原理差别非常非常巨大。将它与大脑进行类比给它赋予了一些神奇的光环,这种描述是很危险的,这将导致天花乱坠的宣传,大家在要求一些不切实际的事情。
深度学习训练过程实际上还是拟合参数,但是人脑神经元的相互作用不一定是拟合参数。
预备知识
配置环境
—window10
- 下载anaconda和d2l-zh-1.0.zip
- 打开anaconda powershell prompt
- 配置清华PyPI镜像:pip config set global.index -url https://pypi.tuna.tsinghua.edu.cn/simple
- 创建运行环境:conda env create -f environment.yml
- 运行环境:conda activate gluon
—Linux
NDArray数据操作
mxnet的基础是对数据进行操作,NDArray类似NumPy,是MXNet中用于数据储存和变换的主要工具
#创建一个ndarray数组,⽤arange函数创建⼀个⾏向量
from mxnet import nd
x = nd.arange(12)
NDArray的创建方法包括:
- 通过python的list或者tuple直接指定值
- 通过arange创建一维行向量之后reshape修改形状
- 通过ones,zeros创建指定形状的张量
- 通过nd.random生成随机值的张量,例如nd.random.normal生成的是正态分布的随机数
NDArray的运算方法:
- ndarray的运算包括基本的加减乘初,不过要求参与运算的两个对象大小相同,
- ndarray提供dot函数计算张量的矩阵乘法。
- ndarray提供concat函数支持多个张量连结
- 条件运算==判断对应位置的值是否相等
- ndarray提供sum函数计算特定维度的和,没有指定维度则计算所有元素的和
- ndarray提供asscalar函数将结果变成标量
NDArray的广播机制:
广播机制针对两个形状不同的NDArray进行按元素进行运算。
广播机制原则
- 输出的shape是输入中最大的值,输入的shape中不足的部分都通过在前面加1补齐
- 输入数组要求shape上的每个位置要么是1要么和输出一致
NDArray索引:
通俗说:索引就是用冒号分隔开,对张量内元素进行定位查找或者修改。
x[:2]
#输出
[0. 1. 2.]
<NDArray 3 @cpu(0)>
NDArray与NumPy转化:
通过array函数和asnumpy函数令数据在NDArray和NumPy格式之间相互变换。
NDArray自动求梯度
步骤:
- 调⽤attach_grad函数来申请存储梯度所需要的内存
- 调⽤record函数来要求MXNet记录与求梯度有关的计算
- 通过调⽤backward函数⾃动求梯度
from mxnet import autograd, nd
x = nd.arange(4).reshape((4, 1))
x.attach_grad()
with autograd.record():
y = 2 * nd.dot(x.T, x)
y.backward()
x.grad
#输出
[[ 0.]
[ 4.]
[ 8.]
[12.]]
<NDArray 4x1 @cpu(0)>