Mean absolute loss(MAE)也被称为L1 Loss,是以绝对误差作为距离。损失函数公式:
- import torch
-
- # 1. 多任务交叉熵损失
- # 设置真实值: 可以是热编码后的结果也可以不进行热编码
- # 注意的类型必须是64位整型数据
- # y_true = torch.tensor([1,2],dtype=torch.int64)
- y_true = torch.tensor([[0, 1, 0], [0, 0, 1]], dtype=torch.float32)
- y_pred = torch.tensor([[1,10,1],[2,3,10]],dtype=torch.float32)
-
- # 实例化多任务交叉熵损失
- L= torch.nn.CrossEntropyLoss()
- # 计算损失结果
- print(L(y_pred,y_true))
-
-
- # 2. 二分类的交叉熵
- y_true = torch.tensor([0,0,1],dtype=torch.float32)
- y_pred = torch.tensor([0.01,0.02,0.7],dtype=torch.float32)
- # 二分类交叉熵损失
- L= torch.nn.BCELoss()
- print(L(y_pred,y_true))
-
-
- # 3. 回归任务
- y_true = torch.tensor([2.0,0.5,10],dtype=torch.float32)
- # y_pred = torch.tensor([2,8,0.9],dtype=torch.float32)
- y_pred = torch.tensor([2,0.8,9],dtype=torch.float32)
-
- # L =torch.nn.L1Loss()
- # L =torch.nn.MSELoss()
- L =torch.nn.SmoothL1Loss()
-
- print(L(y_pred,y_true))
- import torch
- import matplotlib.pyplot as plt
-
- # 产生30天的随机温度
- temperature = torch.randn([30,]) * 10
- # 绘制平均温度
- x = torch.arange(0,30,1)
- plt.scatter(x,temperature)
-
-
- # 指数加权平均
- exp = [] # 指数加权后的值
- beta = 0.9
- for idx,tmp in enumerate(temperature):
- # 第一个元素的的 EWA 值等于自身
- if idx ==0:
- exp.append(tmp)
- continue
- # 第二个元素的 EWA 值等于上一个 EWA 乘以 β + 当前气温乘以 (1-β)
- t = beta * exp[idx-1] + (1-beta) * tmp
- exp.append(t)
-
- plt.scatter(x,temperature)
- plt.plot(x,exp)
- plt.show()
- import torch
- from torch import optim
-
- # 1. SGD
- # 初始化权重参数
- w = torch.tensor([1.0],requires_grad=True)
- y = (w**2/2.0).sum() # 损失函数
-
- # 优化方法:SGD指定参数beta(momentum)
- # optimizer = optim.SGD([w],lr=0.01,momentum=0.9)
-
- # 优化方法: Adagrad
- # optimizer = optim.Adagrad([w],lr=0.01)
-
- # 优化方法: RMSProp
- optimizer = optim.RMSprop([w],lr=0.01,alpha=0.9)
-
- # 优化方法:Adam
- optimizer = optim.Adam([w],lr=0.01,betas=[0.9,0.99])
-
-
-
- # 第一次更新计算梯度,并对参数进行更新
- optimizer.zero_grad() # 梯度清零
- y.backward() # 自动微分
- optimizer.step() # 更新权重
- # 打印结果
- print(w.detach().numpy()) # w本身
- print(w.grad.numpy()) # 梯度结果
-
- # 第二次更新计算梯度,并对参数进行更新
- y = (w**2/2.0).sum()
- optimizer.zero_grad() # 梯度清零
- y.backward() # 自动微分
- optimizer.step() # 更新权重
- # 打印结果
- print(w.detach().numpy())
- print(w.grad.numpy())
- import torch
- import matplotlib.pyplot as plt
-
- # 初始化参数
- y_true = torch.tensor([0.1])
- w = torch.tensor([1.0],requires_grad=True)
- x = torch.tensor([1.0])
- # 设置优化器
- optimizer = torch.optim.SGD([w],lr=0.1,momentum=0.9)
-
- # 设置间隔学习率下降策略 step_size:调整间隔数=50 , gamma:调整系数
- lr_s = torch.optim.lr_scheduler.StepLR(optimizer,step_size=20,gamma=0.1)
-
- # 设置指定间隔学习率下降策略 milestones:设定调整轮次 , gamma:调整系数
- # lr_s = torch.optim.lr_scheduler.MultiStepLR(optimizer,milestones=[50, 125, 160],gamma=0.1)
-
- # 设置指数学习率下降策略 gamma:指数的底
- # lr_s = torch.optim.lr_scheduler.ExponentialLR(optimizer,gamma=0.98)
-
- # 获取学习率和当前的epoch
- lr_list = [] # 学习率
- for epoch in range(200): # 轮次
- lr_list.append(lr_s.get_last_lr()) # get_last_lr 提取学习率
- for i in range(10): # 批次
- loss = (w*x-y_true)**2/2.0 # 损失函数
- optimizer.zero_grad() # 梯度清零
- loss.backward() # 自动微分
- optimizer.step() # 更新权重
- # 更新下一个epoch的学习率
- lr_s.step()
-
- plt.plot(torch.arange(0,200),lr_list)
- plt.grid()
- plt.show()