文章目录
一、书籍介绍二、课节笔记课节1:paddle使用基础reshape使用技巧改变张量数据类型张量的数学运算张量的逻辑运算张量的矩阵运算广播机制(没搞懂)不懂的地方课节2:机器学习课节3:线性分类课节4:前馈神经网络课节5:卷积神经网络课节6:循环神经网络课节7:网络优化与正则化课节8:注意力机制三、作业笔记第1课作业:安装Paddle第2课作业:第3课作业:第4课作业:第5课作业:第6课作业:第7课作业:第8课作业:一些记录一、书籍介绍
《神经网络与深度学习从理论到实践》(7月新出的)是复旦大学邱锡鹏老师与百度飞桨对《神经网络与深度学习》(蒲公英书)的配套理论课程的实践课程内容。
其中,《神经网络与深度学习》是开源书籍和开源项目
《神经网络与深度学习》书籍地址 《神经网络与深度学习》GitHub项目地址《神经网络与深度学习》百度飞桨课程地址
书籍《神经网络与深度学习从理论到实践》是近期的网络直播课程,直播时间7月19日-7月27日
《神经网络与深度学习从理论到实践》直播地址
《神经网络与深度学习从理论到实践》百度飞桨课程地址
二、课节笔记
课节1:paddle使用基础
paddle基本上和pytorch和numpy的用法基本一致,有些地方略有不同。
reshape使用技巧
使用reshape时存在一些技巧,比如:
-1表示这个维度的值是从张量的元素总数和剩余维度推断出来的。因此,有且只有一个维度可以被设置为-1。0表示实际的维数是从张量的对应维数中复制出来的,因此shape中0所对应的索引值不能超过张量的总维度。
改变张量数据类型
如果想改变张量的数据类型,可以通过调用paddle.cast
API来实现。
# 定义dtype为float32的Tensorfloat32_Tensor = paddle.to_tensor(1.0)# paddle.cast可以将输入数据的数据类型转换为指定的dtype并输出。支持输出和输入数据类型相同。int64_Tensor = paddle.cast(float32_Tensor, dtype='int64')print("Tensor after cast to int64:", int64_Tensor.dtype)Tensor after cast to int64: paddle.int64
张量的数学运算
张量支持包括基础数学运算、逻辑运算、矩阵运算等100余种运算操作,以加法为例,有如下两种实现方式:
1)使用飞桨APIpaddle.add(x,y)
。
2)使用张量类成员函数x.add(y)
。
张量类的基础数学函数如下:
x.abs() # 逐元素取绝对值x.ceil() # 逐元素向上取整x.floor() # 逐元素向下取整x.round() # 逐元素四舍五入x.exp() # 逐元素计算自然常数为底的指数x.log() # 逐元素计算x的自然对数x.reciprocal()# 逐元素求倒数x.square()# 逐元素计算平方x.sqrt() # 逐元素计算平方根x.sin() # 逐元素计算正弦x.cos() # 逐元素计算余弦x.add(y) # 逐元素加x.subtract(y) # 逐元素减x.multiply(y) # 逐元素乘(积)x.divide(y) # 逐元素除x.mod(y) # 逐元素除并取余x.pow(y) # 逐元素幂x.max() # 指定维度上元素最大值,默认为全部维度x.min() # 指定维度上元素最小值,默认为全部维度x.prod() # 指定维度上元素累乘,默认为全部维度x.sum() # 指定维度上元素的和,默认为全部维度
以下操作与上述结果相同。
x + y -> x.add(y) # 逐元素加x - y -> x.subtract(y) # 逐元素减x * y -> x.multiply(y) # 逐元素乘(积)x / y -> x.divide(y) # 逐元素除x % y -> x.mod(y) # 逐元素除并取余x ** y -> x.pow(y) # 逐元素幂
张量的逻辑运算
张量类的逻辑运算函数如下:
x.isfinite() # 判断Tensor中元素是否是有限的数字,即不包括inf与nanx.equal_all(y)# 判断两个Tensor的全部元素是否相等,并返回形状为[1]的布尔类Tensorx.equal(y)# 判断两个Tensor的每个元素是否相等,并返回形状相同的布尔类Tensorx.not_equal(y)# 判断两个Tensor的每个元素是否不相等x.less_than(y)# 判断Tensor x的元素是否小于Tensor y的对应元素x.less_equal(y)# 判断Tensor x的元素是否小于或等于Tensor y的对应元素x.greater_than(y) # 判断Tensor x的元素是否大于Tensor y的对应元素x.greater_equal(y) # 判断Tensor x的元素是否大于或等于Tensor y的对应元素x.allclose(y) # 判断两个Tensor的全部元素是否接近
张量的矩阵运算
张量类还包含了矩阵运算相关的函数,如矩阵的转置、范数计算和乘法等。
x.t()# 矩阵转置x.transpose([1, 0]) # 交换第 0 维与第 1 维的顺序x.norm('fro') # 矩阵的弗罗贝尼乌斯范数x.dist(y, p=2)# 矩阵(x-y)的2范数x.matmul(y) # 矩阵乘法
有些矩阵运算中也支持大于两维的张量,比如matmul函数,对最后两个维度进行矩阵乘。比如x是形状为[j,k,n,m]的张量,另一个y是[j,k,m,p]的张量,则x.matmul(y)输出的张量形状为[j,k,n,p]。
广播机制(没搞懂)
广播(Broadcasting)机制允许在一些运算时使用不同形状的张量。通常来讲,如果有一个形状较小和一个形状较大的张量,会希望多次使用较小的张量来对较大的张量执行某些操作,看起来像是形状较小的张量首先被扩展到和较大的张量形状一致,然后再做运算。
广播机制主要遵循如下规则(参考Numpy广播机制):
1)每个张量至少为一维张量。
2)从后往前比较张量的形状,当前维度的大小要么相等,要么其中一个等于1,要么其中一个不存在。
广播例子1(没看懂):
# 当两个Tensor的形状一致时,可以广播x = paddle.ones((2, 3, 4))y = paddle.ones((2, 3, 4))z = x + yprint('broadcasting with two same shape tensor: ', z.shape)x = paddle.ones((2, 3, 1, 5))y = paddle.ones((3, 4, 1))# 从后往前依次比较:# 第一次:y的维度大小是1# 第二次:x的维度大小是1# 第三次:x和y的维度大小相等,都为3# 第四次:y的维度不存在# 所以x和y是可以广播的z = x + yprint('broadcasting with two different shape tensor:', z.shape)broadcasting with two same shape tensor: [2, 3, 4]broadcasting with two different shape tensor: [2, 3, 4, 5]
从输出结果看,x与y在上述两种情况中均遵循广播规则,因此在张量相加时可以广播。我们再定义两个shape分别为[2, 3, 4]和[2, 3, 6]的张量,观察这两个张量是否能够通过广播操作相加。
广播例子2(这个好理解):
x = paddle.ones((2, 3, 4))y = paddle.ones((2, 3, 6))z = x + y
输出结果为:
ValueError: (InvalidArgument) Broadcast dimension mismatch.
从输出结果看,此时x和y是不能广播的,因为在第一次从后往前的比较中,4和6不相等,不符合广播规则。
广播机制的计算规则
现在我们知道在什么情况下两个张量是可以广播的。两个张量进行广播后的结果张量的形状计算规则如下:
1)如果两个张量shape的长度不一致,那么需要在较小长度的shape前添加1,直到两个张量的形状长度相等。
2) 保证两个张量形状相等之后,每个维度上的结果维度就是当前维度上较大的那个。
以张量x和y进行广播为例,x的shape为[2, 3, 1,5],张量y的shape为[3,4,1]。首先张量y的形状长度较小,因此要将该张量形状补齐为[1, 3, 4, 1],再对两个张量的每一维进行比较。从第一维看,x在一维上的大小为2,y为1,因此,结果张量在第一维的大小为2。以此类推,对每一维进行比较,得到结果张量的形状为[2, 3, 4, 5]。
由于矩阵乘法函数paddle.matmul在深度学习中使用非常多,这里需要特别说明一下它的广播规则:
1)如果两个张量均为一维,则获得点积结果。
2) 如果两个张量都是二维的,则获得矩阵与矩阵的乘积。
3) 如果张量x是一维,y是二维,则将x的shape转换为[1, D],与y进行矩阵相乘后再删除前置尺寸。
4) 如果张量x是二维,y是一维,则获得矩阵与向量的乘积。
5) 如果两个张量都是N维张量(N > 2),则根据广播规则广播非矩阵维度(除最后两个维度外其余维度)。比如:如果输入x是形状为[j,1,n,m]的张量,另一个y是[k,m,p]的张量,则输出张量的形状为[j,k,n,p]。
In [4]
x = paddle.ones([10, 1, 5, 2])y = paddle.ones([3, 2, 5])z = paddle.matmul(x, y)print('After matmul: ', z.shape)After matmul: [10, 3, 5, 5]
从输出结果看,计算张量乘积时会使用到广播机制。
注意
飞桨的API有原位(inplace)操作和非原位操作之分。原位操作即在原张量上保存操作结果,非原位操作则不会修改原张量,而是返回一个新的张量来表示运算结果。在飞桨框架V2.1及之后版本,部分API有对应的原位操作版本,在API后加上’_'表示,如:x.add(y)
是非原位操作,x.add_(y)
为原位操作。
不懂的地方
课节2:机器学习
课节3:线性分类
课节4:前馈神经网络
课节5:卷积神经网络
课节6:循环神经网络
课节7:网络优化与正则化
课节8:注意力机制
三、作业笔记
第1课作业:安装Paddle
作业内容:成功安装paddle到本地完成标志:在本地计算机成功导入paddle完成方法:在安装帮助页面里按照帮助进行安装:.cn/install/quick?docurl=/documentation/docs/zh/install/conda/windows-conda.html第1课作业很简单,主要是安个包