损失函数
1. 均方误差损失函数
调用方法如下:
torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')
参数说明如下:
- size_average(bool,optional):基本弃用。默认情况下,损失是批次中每个损失元素的平均值。如果将字段size_average设置为False,则需要将每个batch的损失相加。当reduce设置为Fasle时忽略。默认值为True
- reduce(bool,optional):基本弃用。默认情况下,根据size_average,对每个batch中结果的损失进行平均或求和。当reduce为Fasle时,返回batch中每个元素的损失并忽略size_average。默认值为True
- reduction(string,optional):输出元素包含3中操作方式,即none,mean和sum。
- none:不做处理
- mean:输出的总和除以输出中元素的数量
- sum:输出的和
2. 交叉熵损失函数
交叉熵损失函数将nn.LogSoftmax()和nn.NLLLoss()合并再一个类中,函数名为CrossEntropyLoss().调用方法如下:
torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100,reduce=None,reduction='mean')
参数说明如下:
- weight(Tensor,optional):在多分类任务中,手动给出每个类别权重的缩放量 。如果给出,则其是一个大小等于类别个数的张量
- size_average(bool,optional):已基本弃用,与均方误差损失函数一样
- ignore_index(int,optional):指定被忽略且不对输入梯度做贡献的目标值。
- reduce(bool,optional):已基本弃用,与均方误差损失函数一样
- reduction(bool,optional):输出元素包含3中操作方式,即none,mean和sum。
- none:不做处理
- mean:输出的总和除以输出中元素的数量
- sum:输出的和
注意!!
Pytorch是不支持ont-hot编码类型的,输入的都是真实的target,所以如果输入的真实分类是one-hot编码的话则需要自行转换,即将target ont_hot 的编码格式转换为每个样本的类别,再传给CrossEntropyLoss。实现代码如下:
import numpy as np
import torch
from torch.autograd import Variable
import matplotlib.pyplot as plt
from torch import nn
# 编码one_hot
def one_hot(y):
'''
y :(N)的一维Tensor,值为每个样本的类别
out:
y_onthot:转换为ont_hot编码格式
'''
y = y.view(-1, 1)
y_onehot = torch.FloatTensor(3, 5)
# in your for loop
y_onehot.zero_()
y_onehot.scatter_(1, y, 1)
return y_onehot
def cross_entropy_one_hot(target):
# 解码
_, labels = target.max(dim=1)
return labels
# 如果需要调用cross_entropy,则还需要传入一个input_
# return F.cross_entropy(input_,labels)
x = np.array([1, 2, 3]).astype(np.int64)
x_tensor = torch.from_numpy(x)
print(one_hot(x_tensor))
x2 = np.array([[0, 1, 0, 0, 0]])
x2_tensor = torch.from_numpy(x2)
print(cross_entropy_one_hot(x2_tensor))
运行结果: