PyTorch nn.MSELoss() 均方误差损失函数详解和要点提醒

2024-06-24 01:44

本文主要是介绍PyTorch nn.MSELoss() 均方误差损失函数详解和要点提醒,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • nn.MSELoss() 均方误差损失函数
    • 参数
    • 数学公式
      • 元素版本
    • 要点
    • 附录
  • 参考链接

nn.MSELoss() 均方误差损失函数

torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')

Creates a criterion that measures the mean squared error (squared L2 norm) between each element in the input x x x and target y y y.

计算输入和目标之间每个元素的均方误差(平方 L2 范数)。

参数

  • size_average (bool, 可选):
    • 已弃用。请参阅 reduction 参数。
    • 默认情况下,损失在批次中的每个损失元素上取平均(True);否则(False),在每个小批次中对损失求和。
    • reduceFalse 时忽略该参数。
    • 默认值是 True
  • reduce (bool, 可选):
    • 已弃用。请参阅 reduction 参数。
    • 默认情况下,损失根据 size_average 参数进行平均或求和。
    • reduceFalse 时,返回每个批次元素的损失,并忽略 size_average 参数。
    • 默认值是 True
  • reduction (str, 可选):
    • 指定应用于输出的归约方式。
    • 可选值为 'none''mean''sum'
      • 'none':不进行归约。
      • 'mean':输出的和除以输出的元素总数。
      • 'sum':输出的元素求和。
    • 注意:size_averagereduce 参数正在被弃用,同时指定这些参数中的任何一个都会覆盖 reduction 参数。
    • 默认值是 'mean'

数学公式

附录部分会验证下述公式和代码的一致性。

假设有 N N N 个样本,每个样本的输入为 x n x_n xn,目标为 y n y_n yn。均方误差损失的计算步骤如下:

  1. 单个样本的损失
    计算每个样本的均方误差:
    l n = ( x n − y n ) 2 l_n = (x_n - y_n)^2 ln=(xnyn)2
    其中 l n l_n ln 是第 n n n 个样本的损失。
  2. 总损失
    计算所有样本的平均损失(reduction 参数默认为 'mean'):
    L = 1 N ∑ n = 1 N l n = 1 N ∑ n = 1 N ( x n − y n ) 2 \mathcal{L} = \frac{1}{N} \sum_{n=1}^{N} l_n = \frac{1}{N} \sum_{n=1}^{N} (x_n - y_n)^2 L=N1n=1Nln=N1n=1N(xnyn)2
    如果 reduction 参数为 'sum',总损失为所有样本损失的和:
    L = ∑ n = 1 N l n = ∑ n = 1 N ( x n − y n ) 2 \mathcal{L} = \sum_{n=1}^{N} l_n = \sum_{n=1}^{N} (x_n - y_n)^2 L=n=1Nln=n=1N(xnyn)2
    如果 reduction 参数为 'none',则返回每个样本的损失 l n l_n ln 组成的张量:
    L = [ l 1 , l 2 , … , l N ] = [ ( x 1 − y 1 ) 2 , ( x 2 − y 2 ) 2 , … , ( x N − y N ) 2 ] \mathcal{L} = [l_1, l_2, \ldots, l_N] = [(x_1 - y_1)^2, (x_2 - y_2)^2, \ldots, (x_N - y_N)^2] L=[l1,l2,,lN]=[(x1y1)2,(x2y2)2,,(xNyN)2]

元素版本

假设输入张量 x \mathbf{x} x 和目标张量 y \mathbf{y} y 具有相同的形状,每个张量包含 N N N 个元素。均方误差损失的计算步骤如下:

  1. 单个元素的损失
    计算每个元素的均方误差:
    l i j = ( x i j − y i j ) 2 l_{ij} = (x_{ij} - y_{ij})^2 lij=(xijyij)2
    其中 l i j l_{ij} lij 是输入张量和目标张量在位置 ( i , j ) (i, j) (i,j) 的元素损失。
  2. 总损失
    计算所有元素的平均损失(reduction 参数默认为 'mean'):
    L = 1 N ∑ i , j l i j = 1 N ∑ i , j ( x i j − y i j ) 2 \mathcal{L} = \frac{1}{N} \sum_{i,j} l_{ij} = \frac{1}{N} \sum_{i,j} (x_{ij} - y_{ij})^2 L=N1i,jlij=N1i,j(xijyij)2
    如果 reduction 参数为 'sum',总损失为所有元素损失的和:
    L = ∑ i , j l i j = ∑ i , j ( x i j − y i j ) 2 \mathcal{L} = \sum_{i,j} l_{ij} = \sum_{i,j} (x_{ij} - y_{ij})^2 L=i,jlij=i,j(xijyij)2
    如果 reduction 参数为 'none',则返回每个元素的损失 l i j l_{ij} lij 组成的张量:
    L = { l i j } = { ( x i j − y i j ) 2 } \mathcal{L} = \{l_{ij}\} = \{(x_{ij} - y_{ij})^2 \} L={lij}={(xijyij)2}

要点

  1. nn.MSELoss() 接受的输入和目标应具有相同的形状和类型。
    使用示例
    import torch
    import torch.nn as nn# 定义输入和目标张量
    input = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True)
    target = torch.tensor([[1.5, 2.5], [3.5, 4.5]])# 使用 nn.MSELoss 计算损失
    criterion = nn.MSELoss()
    loss = criterion(input, target)print(f"Loss using nn.MSELoss: {loss.item()}")
    
    >>> Loss using nn.MSELoss: 0.25
    
  2. nn.MSELoss()reduction 参数指定了如何归约输出损失。默认值是 'mean',计算的是所有样本的平均损失。
    • 如果 reduction 参数为 'mean',损失是所有样本损失的平均值。
    • 如果 reduction 参数为 'sum',损失是所有样本损失的和。
    • 如果 reduction 参数为 'none',则返回每个样本的损失组成的张量。
      代码示例
    import torch
    import torch.nn as nn# 定义输入和目标张量
    input = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True)
    target = torch.tensor([[1.5, 2.5], [3.5, 4.5]])# 使用 nn.MSELoss 计算损失(reduction='mean')
    criterion_mean = nn.MSELoss(reduction='mean')
    loss_mean = criterion_mean(input, target)
    print(f"Loss with reduction='mean': {loss_mean.item()}")# 使用 nn.MSELoss 计算损失(reduction='sum')
    criterion_sum = nn.MSELoss(reduction='sum')
    loss_sum = criterion_sum(input, target)
    print(f"Loss with reduction='sum': {loss_sum.item()}")# 使用 nn.MSELoss 计算损失(reduction='none')
    criterion_none = nn.MSELoss(reduction='none')
    loss_none = criterion_none(input, target)
    print(f"Loss with reduction='none': {loss_none}")
    
    >>> Loss with reduction='mean': 0.25
    >>> Loss with reduction='sum': 1.0
    >>> Loss with reduction='none': tensor([[0.2500, 0.2500],[0.2500, 0.2500]], grad_fn=<MseLossBackward0>)
    

附录

用于验证数学公式和函数实际运行的一致性

import torch
import torch.nn.functional as F# 假设有两个样本,每个样本有两个维度
input = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True)
target = torch.tensor([[1.5, 2.5], [3.5, 4.5]])# 根据公式实现均方误差损失
def mse_loss(input, target):return ((input - target) ** 2).mean()# 使用 nn.MSELoss 计算损失
criterion = torch.nn.MSELoss(reduction='mean')
loss_torch = criterion(input, target)# 使用根据公式实现的均方误差损失
loss_custom = mse_loss(input, target)# 打印结果
print("PyTorch 计算的均方误差损失:", loss_torch.item())
print("根据公式实现的均方误差损失:", loss_custom.item())# 验证结果是否相等
assert torch.isclose(loss_torch, loss_custom), "数学公式验证失败"
>>> PyTorch 计算的均方误差损失: 0.25
>>> 根据公式实现的均方误差损失: 0.25

输出没有抛出 AssertionError,验证通过。

参考链接

MSELoss - Docs

这篇关于PyTorch nn.MSELoss() 均方误差损失函数详解和要点提醒的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088849

相关文章

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

Jitter Injection详解

一、定义与作用 Jitter Injection,即抖动注入,是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整,以实现对整个通信系统的时延和抖动的控制。其主要作用包括: 改善传输质量:通过调整数据包的时延和抖动,可以有效地降低误码率,提高数据传输的可靠性。均衡网络负载:通过对不同的数据流进行不同程度的抖动注入,可以实现网络资源的合理分配,提高整体传输效率。增

SQL Server中,isnull()函数以及null的用法

SQL Serve中的isnull()函数:          isnull(value1,value2)         1、value1与value2的数据类型必须一致。         2、如果value1的值不为null,结果返回value1。         3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。        如

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述   在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特点和优势,适用于不同的应用场景和需求。   Kafka 是一个高性能、可扩展的分布式消息队列系统,被设计用于处理大规模的数据流和实时数据传输。它