# Pytorch 的损失函数Loss function使用详解

## 1、损失函数

import torch
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2))
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a)

sample 的值为：[[1,1],[1,1]]。

target 的值为：[[0,1],[2,3]]。

### 1、nn.L1Loss

L1Loss 计算方法很简单，取预测值和真实值的绝对误差的平均数即可。

criterion = nn.L1Loss()
loss = criterion(sample, target)
print(loss)

### 2、nn.SmoothL1Loss

SmoothL1Loss 也叫作 Huber Loss，误差在 (-1,1) 上是平方损失，其他情况是 L1 损失。

criterion = nn.SmoothL1Loss()
loss = criterion(sample, target)
print(loss)

### 3、nn.MSELoss

criterion = nn.MSELoss()
loss = criterion(sample, target)
print(loss)

### 4、nn.CrossEntropyLoss

import torch
# cross entropy loss
pred = np.array([[0.8, 2.0, 1.2]])
CELoss = torch.nn.CrossEntropyLoss()
for k in range(3):
target = np.array([k])
loss2 = CELoss(torch.from_numpy(pred), torch.from_numpy(target).long())
print(loss2)

Output：

tensor(1.7599, dtype=torch.float64)
tensor(0.5599, dtype=torch.float64)
tensor(1.3599, dtype=torch.float64)

tensor(2.0334, dtype=torch.float64)
tensor(0.8334, dtype=torch.float64)
tensor(0.8334, dtype=torch.float64)

pred = np.array([[0.8, 2.0, 2.0]])
nClass = pred.shape[1]
target = np.array([0])

def labelEncoder(y):
tmp = np.zeros(shape = (y.shape[0], nClass))
for i in range(y.shape[0]):
tmp[i][y[i]] = 1
return tmp
def crossEntropy(pred, target):
target = labelEncoder(target)
pred = softmax(pred)
H = -np.sum(target*np.log(pred))
return H
H = crossEntropy(pred, target)

0334282107562287

### 6、nn.NLLLoss

NLLLoss 的 输入 是一个对数概率向量和一个目标标签(不需要是one-hot编码形式的). 它不会为我们计算对数概率. 适合网络的最后一层是log_softmax. 损失函数 nn.CrossEntropyLoss() 与 NLLLoss() 相同, 唯一的不同是它为我们去做 softmax.

Nn.NLLLoss 和 nn.CrossEntropyLoss 的功能是非常相似的！通常都是用在多分类模型中，实际应用中我们一般用 NLLLoss 比较多。

### 7、nn.NLLLoss2d

input, (N, C, H, W)

target, (N, H, W)

criterion = nn.NLLLoss2d()
loss = criterion(sample, target)
print(loss)

### 8、BCEWithLogitsLoss 与 MultilabelSoftMarginLoss

BCEWithLogitsLoss :

MultiLabelSoftMarginLoss :

import torch
from torch import nn
x = Variable(torch.randn(10, 3))
y = Variable(torch.FloatTensor(10, 3).random_(2))

# double the loss for class 1
class_weight = torch.FloatTensor([1.0, 2.0, 1.0])
# double the loss for last sample
element_weight = torch.FloatTensor([1.0]*9 + [2.0]).view(-1, 1)
element_weight = element_weight.repeat(1, 3)

bce_criterion = nn.BCEWithLogitsLoss(weight=None, reduce=False)
multi_criterion = nn.MultiLabelSoftMarginLoss(weight=None, reduce=False)

bce_criterion_class = nn.BCEWithLogitsLoss(weight=class_weight, reduce=False)
multi_criterion_class = nn.MultiLabelSoftMarginLoss(weight=class_weight,
reduce=False)

bce_criterion_element = nn.BCEWithLogitsLoss(weight=element_weight, reduce=False)
multi_criterion_element = nn.MultiLabelSoftMarginLoss(weight=element_weight,
reduce=False)

bce_loss = bce_criterion(x, y)
multi_loss = multi_criterion(x, y)

bce_loss_class = bce_criterion_class(x, y)
multi_loss_class = multi_criterion_class(x, y)

print(bce_loss_class)
print(multi_loss_class)

print('bce_loss',bce_loss)
print('bce loss mean', torch.mean(bce_loss, dim = 1))
print('multi_loss', multi_loss)

### 9、比较BCEWithLogitsLoss和TensorFlow的 sigmoid_cross_entropy_with_logits；softmax_cross_entropy_with_logits

pytorch BCEwithLogitsLoss 参考前面8的介绍。

from torch import nn
bce_criterion = nn.BCEWithLogitsLoss(weight = None, reduce = False)
y = Variable(torch.tensor([[1,0,0],[0,1,0],[0,0,1],[1,1,0],[0,1,0]],dtype=torch.float64))
logits = Variable(torch.tensor([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]],dtype=torch.float64))
bce_criterion(logits, y)

result：

tensor([[6.1442e-06, 3.0486e+00, 2.1269e+00],
[3.0486e+00, 4.5399e-05, 1.3133e+00],
[1.3133e+00, 2.1269e+00, 6.7153e-03],
[1.8150e-02, 1.5023e-03, 1.4633e+00],
[3.0486e+00, 2.4757e-03, 1.3133e+00]], dtype=torch.float64)

Keras binary_crossentropy 也是调用 Tf sigmoid_cross_entropy_with_logits. keras binary_crossentropy 源码;

def loss_fn(y_true, y_pred, e=0.1):
bce_loss = K.binary_crossentropy(y_true, y_pred)
return K.mean(bce_loss, axis = -1)

y = K.variable([[1,0,0],[0,1,0],[0,0,1],[1,1,0],[0,1,0]])
logits = K.variable([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]])
res = loss_fn(logits, y)
print(K.get_value(res))

from keras.losses import binary_crossentropy
print(K.get_value(binary_crossentropy(logits, y)))

result:

[-31.59192  -26.336359  -5.1384177 -38.72286  -5.0798492]
[-31.59192  -26.336359  -5.1384177 -38.72286  -5.0798492]

y = np.array([[1,0,0],[0,1,0],[0,0,1],[1,1,0],[0,1,0]])
logits = np.array([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]]).astype(np.float32)

sess =tf.Session()
y = np.array(y).astype(np.float32) # labels是float64的数据类型
E2 = sess.run(tf.nn.softmax_cross_entropy_with_logits(labels=y,
logits=logits))
print(E2)

result：

[1.6878611e-04 1.0346780e-03 6.5883912e-02 2.6669841e+00 5.4985214e-02]

# 承接Matlab、Python和C++的编程，机器学习、计算机视觉的理论实现及辅导，本科和硕士的均可，咸鱼交易，专业回答请走知乎，详谈请联系QQ号757160542，非诚勿扰。

0 条评论

• ### tf.losses.get_regularization_loss()

定义在：tensorflow/python/ops/losses/util.py。

• ### python SyntaxError: EOL while scanning string literal

写代码拼接windows 路径出现这个错误， 查资料才知道 python中字符串不能以 \ 结尾

• ### 【学习笔记】深度学习 demo2 二次函数回归

\[\begin{aligned} f(x) &= \left(x - 4 \right) \left(x - 8\right) + rand \\ &= x ...

• ### Windows系统下 下载安装nodejs、npm和express的教程

这篇文章主要介绍了Windows系统下nodejs、npm、express的下载和安装教程详解,非常不错，具有参考借鉴价值，需要的朋友可以参考下

• ### 代码审计整理

代码审计（Code audit）是一种以发现程序错误，安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析，旨在发现错误，安全漏...

• ### Python获取当前日期和日期差计算

关于python的日期和时间，用法很多，此处只记录自己比较常用的部分，后面有时间再学习一下时间戳。

• ### vscode+Node搭建vue脚手架

一路默认即可，安装完成之后win+r 打开cmd命令提示符，然后输入node -v 如果显示的是版本v12.16.3 这样的

• ### 匪夷所思：罕见的 Oracle 全局事务锁等待事件分析

杨廷琨，云和恩墨CTO，Oracle ACED，ITPUB Oracle 数据库管理版版主 ，人称"杨长老”，十数年如一日坚持进行Oracle技术研究与写作，号...

• ### Django表单集合----Formset

Formset（表单集）是多个表单的集合。Formset在Web开发中应用很普遍，它可以让用户在同一个页面上提交多张表单，一键添加多个数据，比如一个页面上添加多...