文章目录

  • 优化算法
  • 1.SGD
  • 损失函数
  • 一、回归
  • 1.误差平方和SSE (MSE)
  • 二、分类
  • 1.交叉熵损失函数
  • 1. 二分类 交叉熵损失函数 (sigmoid) (BCEWithLogitsLoss / BCELoss)
  • 2.多分类交叉熵损失函数(softmax) (CrossEntropyLoss / logsoftmax+NLLLoss实 )
  • 激活函数
  • 非线性激活函数
  • 1.sigmoid函数 (torch.nn.Sigmoid)
  • 2.RELU (torch.nn.ReLU)


小参考:十、损失函数与反向传播 、优化器

RNN损失函数如何定义 relu损失函数_损失函数

优化算法

torch.optim是一个实现各种优化算法的包。最常用的方法都已经支持了,接口也足够通用

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)
  • 采取优化步骤
    1、所有优化器都实现了一个step()更新参数的方法。它可以通过两种方式使用:optimizer.step()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)

for input, target in dataset:
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    optimizer.step()

1.SGD

torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, 			
				nesterov=False, *, maximize=False)
  • params ( iterable ) – 可迭代的参数以优化或定义参数组
  • lr ( float ) – 学习率
  • momentum -动量因子
import torch.optim as optim
#定义优化算法
opt = optim.SGD(net.parameters() #要优化的参数是哪些?
               , lr=lr #学习率
               , momentum = gamma) #动量参数

zhat = net.forward(X) #向前传播
loss = criterion(zhat,y.reshape(500).long()) #损失函数值
loss.backward() #反向传播
opt.step() #更新权重w,从这一瞬间开始,坐标点就发生了变化,所有的梯度必须重新计算
opt.zero_grad() #清除原来储存好的,基于上一个坐标点计算的梯度,为下一次计算梯度腾出空间

损失函数

一、回归

1.误差平方和SSE (MSE)

公式:

RNN损失函数如何定义 relu损失函数_python_02

import torch
from torch.nn import MSELoss #类
yhat = torch.randn(size=(50,),dtype=torch.float32) 
y = torch.randn(size=(50,),dtype=torch.float32)
criterion = MSELoss() #实例化
loss = criterion(yhat,y)
loss #没有设置随机数种子,所以每次运行的数字都会不一致
#tensor(1.5714)

#在MSELoss中有重要的参数,reduction
#当reduction = "mean" (默认也是mean),则输出MSE
#当reduction = "sum",则输出SSE
criterion = MSELoss(reduction = "mean") #实例化
criterion(yhat,y)
#tensor(1.5714)
criterion = MSELoss(reduction = "sum")
criterion(yhat,y)
#tensor(78.5707)

二、分类

1.交叉熵损失函数

RNN损失函数如何定义 relu损失函数_RNN损失函数如何定义_03


RNN损失函数如何定义 relu损失函数_实例化_04

1. 二分类 交叉熵损失函数 (sigmoid) (BCEWithLogitsLoss / BCELoss)

RNN损失函数如何定义 relu损失函数_git_05

  • BCEWithLogitsLoss内置了sigmoid函数与交叉熵函数,它会自动计算输入值的sigmoid值,因此需要输入zhat与真实标签,且顺序不能变化,zhat必须在前
  • BCELoss中只有交叉熵函数,没有sigmoid层,因此需要输入sigma与真实标签,且顺序不能变化。
import torch
import time
N = 3*pow(10,3)
torch.random.manual_seed(420) 
X = torch.rand((N,4),dtype=torch.float32) 
w = torch.rand((4,1),dtype=torch.float32,requires_grad=True) 
y = torch.randint(low=0,high=2,size=(N,1),dtype=torch.float32) #high取不到
zhat = torch.mm(X,w)
sigma = torch.sigmoid(zhat)

import torch.nn as nn
#调用nn模块下的类
criterion = nn.BCELoss() #实例化
loss = criterion(sigma,y) #真实标签在后
loss
#tensor(0.8685, grad_fn=<BinaryCrossEntropyBackward0>)

criterion2 = nn.BCEWithLogitsLoss() #实例化
loss = criterion2(zhat,y) #真实标签在后
loss
#tensor(0.8685, grad_fn=<BinaryCrossEntropyWithLogitsBackward0>)

第二种方法很少用,我们了解一下即可:

RNN损失函数如何定义 relu损失函数_实例化_06

from torch.nn import functional as F #直接调用functional库中的计算函数
F.binary_cross_entropy_with_logits(zhat,y) 
#tensor(0.8685, grad_fn=<BinaryCrossEntropyWithLogitsBackward0>)

F.binary_cross_entropy(sigma,y)
#tensor(0.8685, grad_fn=<BinaryCrossEntropyBackward0>)
2.多分类交叉熵损失函数(softmax) (CrossEntropyLoss / logsoftmax+NLLLoss实 )

在PyTorch中实现交叉熵函数的时候,有两种办法:

  • 方法一:调用logsoftmax和NLLLoss实现
import torch
import torch.nn as nn
N = 3*pow(10,2)
torch.random.manual_seed(420) 
X = torch.rand((N,4),dtype=torch.float32) 
w = torch.rand((4,3),dtype=torch.float32,requires_grad=True) 
#定义y时应该怎么做?应该设置为矩阵吗?
y = torch.randint(low=0,high=3,size=(N,),dtype=torch.float32)
zhat = torch.mm(X,w) #从这里开始调用softmax和NLLLoss

logsm = nn.LogSoftmax(dim=1) #实例化
logsigma = logsm(zhat)

criterion = nn.NLLLoss() #实例化
#由于交叉熵损失需要将标签转化为独热形式,因此不接受浮点数作为标签的输入
#对NLLLoss而言,需要输入logsigma
criterion(logsigma,y.long()) #y一维、整型
#tensor(1.1591, grad_fn=<NllLossBackward0>)
  • 方法二:直接调用CrossEntropyLoss
criterion = nn.CrossEntropyLoss()
#对打包好的CorssEnrtopyLoss而言,只需要输入zhat
criterion(zhat,y.long()) #一维、整型
#tensor(1.1591, grad_fn=<NllLossBackward0>)

可以发现,两种输出方法得到的损失函数结果是一致的。与其他损失函数一致,CrossEntropyLoss也有参数reduction,可以设置为mean、sum以及None,大家可以自行尝试其代码并查看返回结果。

激活函数

非线性激活函数

1.sigmoid函数 (torch.nn.Sigmoid)

RNN损失函数如何定义 relu损失函数_实例化_07


RNN损失函数如何定义 relu损失函数_实例化_08

2.RELU (torch.nn.ReLU)

RNN损失函数如何定义 relu损失函数_实例化_09

RNN损失函数如何定义 relu损失函数_损失函数_10