深度学习框架Pytorch——学习笔记(七)常用损失函数和神经网络优化方法,激活函数简述
优化方法参考地址 https://www.leiphone.com/news/201706/e0PuNeEzaXWsMPZX.html
网络的可学习参数 net.parameters()
for parameters in net.parameters():
print(parameters)
使用 net.named_parameters() 可同时返回可学习参数和名称
loss损失函数在nn中常用的都包含,是类的方式,先定义后使用
优化器在torch.optim中 , 传入 net.parameters() 网络的参数
常用的损失函数
(x,y)L1loss
nn.L1Loss()
x与y的差的绝对值
(x,y)均方损失
nn.MSELoss()
x与y的差的平方和
用于多分类的负对数似然损失
nn.NLLLoss()
用于多分类的交叉熵损失
nn.CrassEntropyLoss()
logsoftmax与MLLloss的结合
(x,y)二进制交叉熵
nn.BCELoss()
用前需要在前面加上sigmoid函数
三种优化算法
优化器的作用就是用来更新梯度的。
SGD随机梯度下降
RMSprop快速梯度下降
Adam自动
SGD随机梯度下降算法,带有动量的可选参数
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
RMSprop算法,可以减小某些维度梯度更新波动较大的情况,使其梯度下降的速度变得更快
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99)
Adam 自动更新梯度,一般使用默认值即可
optimizer = torch.optim.Adam(model.parameters())
常见激活函数
神经网络无非是每层的矩阵相乘,其关系是线性的。无论怎么改变,其得到的信息没有太大的差距。所以需要激活函数引入非线性因素,使得神经网络可以任意逼近任何非线性函数,增加了模型泛化的特性。
sigmoid函数 (放弃)
输出在(0,1),把输入变换为0到1之间的输出。
需要进行指数运算,比较慢,且不利于权重优化。
目前基本上只有在做二元分类(0,1)时的输出层才会使用。
tanh函数 (放弃)
输出区间是在(-1,1)之间,以0为中心。
随着Relu的出现所有的隐藏层基本上都使用relu来作为激活函数了
ReLU (最常用)
a=max(0, x) 导数大于0时1,小于0时0。
当输入是负数的时候,ReLU是完全不被激活的.
但是实际的运用中,该缺陷的影响不是很大。
Leaky ReLU函数 (不一定好用)
a=max(zx, x) z=0.01
理论上来讲,Leaky ReLU有ReLU的所有优点,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。