第2章相关数学基础知识
张量:坐标超过两维的数组 张量中的元素
一维的(数组)、二维的(矩阵)、三维的(空间矩阵)、还有很多维的。Pytorch为了把这些各种维统一起来,所以起名叫张量(tensor)。
torch.tensor([
[[9,1,8],[6,7,5],[3,4,2]],
[[2,9,1],[8,6,7],[5,3,4]],
[[1,5,9],[7,2,6],[4,8,3]]
])
标量-向量-张量
张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是二维张量。如果你之前用过NumPy,你会发现
Tensor
和NumPy的多维数组非常类似。
也就是说,tensor和NumPy都是为了表达张量(多维数组),在这些张量(多维数组)上可以进行各种各样的运算,因此把张量及其运算封装成了类,张量的运算就是类里面的方法。
创建tensor:
x = torch.empty(5, 3)
x = torch.rand(5, 3)
x = torch.zeros(5, 3, dtype=torch.long)
x = torch.tensor([5.5, 3])
x = x.new_ones(5, 3, dtype=torch.float64)
y = torch.randn_like(x, dtype=torch.float)
获取Tensor
的形状:
print(x.size())
print(x.shape)
Tensor
的各种操作:
y = torch.rand(5, 3)
print(x + y) # 加法形式一
print(torch.add(x, y)) # 加法形式二
# adds x to y
y.add_(x) # 加法形式三
print(y)
PyTorch中的Tensor
支持超过一百种操作,包括转置、索引、切片、数学运算、线性代数、随机数等等。
范数(Frobenius Norm)
卷积:
输入-x w -核函数 输出-特征映射
激活函数
2.4.1线性激活函数
1.恒等函数 f(x)=x
2.阶跃函数
2.4.2非线性激活函数(一般都为非线性)
1.sigmond函数
也称逻辑激活函数(Logic Activation Function)最常用于二元分类问题,存在梯度消失问题。
sigmond函数的导数
使用sigmond函数作为激活函数存在以下问题:
1)梯度饱和:当函数激活值接近于0或者1时,函数的梯度接近于0,在反向传播计算梯度过程中,每层残差接近于0,计算出的梯度也不可避免地接近于0.这样在参数微调过程中,会引起参数弥散问题,传到前几层的梯度已经非常接近0了,参数几乎不会再更新。
2)函数输出不是以0为中心的。我们更偏向于当激活函数的输入是0时,输出也是0的函数。
因为上面两个问题的存在,导致参数收敛速度很慢,严重影响了训练的效率。因此在设计神经网络时,很少采用sigmond激活函数。
2.tanh函数
tanh函数是拉伸过的sigmond函数,以0为中心,因此导数更陡峭,tanh比sigmond激活函数收敛得更快。
值域 -1到1
同样存在梯度饱和问题
3.ReLU函数
ReLU(Rectified Linear Unit修正线性单元)训练速度比tanh快6倍,当输入值为正数时,导数为1,因此不会出现sigmond函数反向传播时的挤压效应。
f(x)=0 x<0 f(x)=x x>=0
ReLU在训练时可能很脆弱,可能死亡。例如通过ReLU神经元的较大梯度可能导致权重更新过头,导致神经元再也不会因为任何数据点激活。如果这一情况发生了,经过这一单元的梯度从此以后将永远为0。如果学习率过高,40%的网络可能死亡,设置一个合适的学习率可以缓解这一问题。
相比sigmod函数和tanh函数,ReLU激活函数的优点在于:
1)梯度不饱和
梯度为1(x>0),因此在反向传播过程中,减轻了梯度弥散的问题,神经网络前几层的参数也可以很快的更新。
2)计算速度快
正向传播过程中,sigmond和tanh函数计算激活值时需要计算指数,而ReLU函数仅需要设置阈值。
收敛速度快
4.Leaky ReLU函数
第5章 注意力机制
学习人类忽略无关信息而关注重要信息-方法:使用掩码,通过权重将图片数据中关键的特征标识出来
附录
BP神经网络实现人脸识别程序等