详解Pytorch中的torch.nn.MSELoss函数(包括每个参数的分析)

news2024/12/22 19:19:20
一、函数介绍

Pytorch中MSELoss函数的接口声明如下,具体网址可以点这里。

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

该函数默认用于计算两个输入对应元素差值平方和的均值。具体地,在深度学习中,可以使用该函数用来计算两个特征图的相似性。

二、使用方式
import torch

# input和target分别为MESLoss的两个输入
input = torch.tensor([0.,0.,0.])
target = torch.tensor([1.,2.,3.])

# MSELoss函数的具体使用方法如下所示,其中MSELoss函数的参数均为默认参数。
loss = torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')
loss = loss(input, target)

print(loss)

# input和target逐元素差值平方和的均值计算如下,可以看到与上述MSELoss函数的返回值相同。
# 证明了MSELoss默认用于计算两个输入逐元素差值平方和的均值。
print(((1-0)*(1-0)+(2-0)*(2-0)+(3-0)*(3-0))/3.)

在这里插入图片描述

三、参数介绍

如果同时给出了reduce、size_average、reduction三个参数,则首先看前两个参数。如果前两个参数均为None,则函数的返回值由reduction参数决定。如果前两个参数不全为None,则函数的返回值由前两个参数决定,在这种情况下,为None的那个参数默认为True。确定了三个参数的取值后,根据下述规则进行计算即可:

  • reduce=True时,若size_average=True,则返回一个batch中所有样本损失的均值,结果为标量。注意,对于MESLoss函数来说,首先对该batch中的所有样本损失进行逐元素均值操作,然后对得到N个值再进行均值操作即得到返回值(假设批大小为N,即该batch中共有N个样本),用官网的话来说,就是The mean operation still operates over all the elements, and divides by N.
  • reduce=True时,若size_average=False,则返回一个batch中所有样本损失的和,结果为标量注意,对于MESLoss函数来说,首先对该batch中的所有样本损失进行逐元素求和操作,然后对得到N个值再进行求和操作即得到返回值(假设批大小为N,即该batch中共有N个样本),用官网的话来说,就是The sum operation still operates over all the elements.
  • reduce=False时,则size_average参数失效,即无论size_average参数为False还是True,效果都是一样的。此时,函数返回的是一个batch中每个样本的损失,结果为向量
  • reduction参数包含了reduce和size_average参数的双重含义。即,当reduction=‘none’时,相当于reduce=False;当reduction=‘sum’时,相当于reduce=True且size_average=False;当reduction=‘mean’时,相当于reduce=True且size_average=True;这也是为什么reduce和size_average参数将在后续版本中被弃用的原因

实际上,大家在使用该函数时完全不用考虑地这么细致。上面之所以分析地这么细致只是想系统地对该函数进行一个分析讲解,用于帮助那些喜欢深究的同学。如果你只是想快速地使用该函数,只需要将前两个参数即reduce和size_average参数置为None,然后对reduction进行传参即可;由于该函数的前两个参数本身就默认为None,因此只需要对reduction进行传参即可,具体使用例子可以参考第四部分。

四、实例讲解

1.当reduction='mean’时,即返回一个batch中所有样本损失的均值。

import torch
import torch.nn.functional as F
input = [[[0.,0.,0.],
          [0.,0.,0.],
          [0.,0.,0.]],

         [[0.,0.,0.],
          [0.,0.,0.],
          [0.,0.,0.]]]
input = torch.tensor(input)

target = [[[1.,2.,3.],
           [4.,5.,6.],
           [7.,8.,9.]],

          [[11.,12.,13.],
           [14.,15.,16.],
           [17.,18.,19.]]]
target = torch.tensor(target)

loss = torch.nn.MSELoss(reduction='mean') # loss = torch.nn.MSELoss()效果相同,因为reduction参数默认为'mean'。
loss = loss(input, target)
print(loss)

# 注意,下式最后除以2是指该函数输入的批大小为2;下式中除以9是指该函数输入的批数据中每个样本的元素个数为9。
mean_result = ((1.*1. + 2.*2. + 3.*3. + 4.*4. + 5.*5. + 6.*6. + 7.*7. + 8.*8. + 9.*9.)/9 + (11.*11. + 12.*12. + 13.*13. + 14.*14. + 15.*15. + 16.*16. + 17.*17. + 18.*18. + 19.*19.)/9) / 2
print(mean_result)

在这里插入图片描述

2.当reduction='sum’时,即返回一个batch中所有样本损失的和。

import torch
import torch.nn.functional as F
input = [[[0.,0.,0.],
          [0.,0.,0.],
          [0.,0.,0.]],

         [[0.,0.,0.],
          [0.,0.,0.],
          [0.,0.,0.]]]
input = torch.tensor(input)

target = [[[1.,2.,3.],
           [4.,5.,6.],
           [7.,8.,9.]],

          [[11.,12.,13.],
           [14.,15.,16.],
           [17.,18.,19.]]]
target = torch.tensor(target)

loss = torch.nn.MSELoss(reduction='sum')
loss = loss(input, target)
print(loss)
sum_result = ((1.*1. + 2.*2. + 3.*3. + 4.*4. + 5.*5. + 6.*6. + 7.*7. + 8.*8. + 9.*9.) + (11.*11. + 12.*12. + 13.*13. + 14.*14. + 15.*15. + 16.*16. + 17.*17. + 18.*18. + 19.*19.))
print(sum_result)

在这里插入图片描述

3.当reduction=‘none’时,即返回的是一个batch中每个样本的损失。

import torch
import torch.nn.functional as F
input = [[[0.,0.,0.],
          [0.,0.,0.],
          [0.,0.,0.]],

         [[0.,0.,0.],
          [0.,0.,0.],
          [0.,0.,0.]]]
input = torch.tensor(input)

target = [[[1.,2.,3.],
           [4.,5.,6.],
           [7.,8.,9.]],

          [[11.,12.,13.],
           [14.,15.,16.],
           [17.,18.,19.]]]
target = torch.tensor(target)

loss = torch.nn.MSELoss(reduction='none')
loss = loss(input, target)
print(loss)

在这里插入图片描述

五、参考链接
  • https://blog.csdn.net/u013548568/article/details/81532605
  • https://blog.csdn.net/RadiantJeral/article/details/86585152

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩转webpack(03):webpack进阶使用

一、自动清理构建目录 避免构建前每次都要手动删除dist 使用 clean-webpack-plugin(默认删除output指定的输出目录) (1)依赖安装 npm i clean-webpack-plugin -D (2)使用 --- webpack.prod.js const Cl…

基于java学生签到考勤系统

开发工具eclipse,jdk1.8 技术:java swing 数据库:mysql5.7 学生选课系统功能:管理员、教师、学生三个角色 一、管理员功能: 1.登录、修改密码、退出系统 2.学生管理:添加、修改、删除、查询 3.班级管理&#x…

YOLOV1算法学习记录

前言 R-CNN系列算法(R-CNN、SPPNet、Fast R-CNN、Faster R-CNN)均是采用two-stage的方法(1.提取region proposal 2.分类边框回归),主要是对region proposal进行识别定位。虽然这类方法检测精度很高,但由于…

Leetcode番外篇——滑动窗口的应用

各位好,博主新建了个公众号《自学编程村》,拉到底部即可看到,有情趣可以关注看看哈哈,关注后还可以加博主wx呦~~~(公众号拉到底部就能看到呦) 我们刚刚在上一节讲述了TCP的滑动窗口。殊不知,它…

基于RISC-V的Copy-On-Write

为什么需要写时拷贝呢? 当 shell执行指令的时候会 fork(),而这个 fork()出来的进程首先会调用的就是 exec来执行对应的命令,如果我们将 fork()创建的进程对地址空间进行了完整的拷贝,那将是一个巨大的消耗 因为在实际应用中,for…

微信小程序框架-全面详解(学习总结---从入门到深化)

小程序与普通网页开发的区别 小程序的主要开发语言是 JavaScript ,小程序的开发同普通的网页 开发相比有很大的相似性。对于前端开发者而言,从网页开发迁移 到小程序的开发成本并不高,但是二者还是多少有些许区别的,例如&#xff…

HCIP实验 4-1:路由引入与路由控制

实验 4-1 路由引入与路由控制 学习目的 掌握OSPF与ISIS相互路由引入的配置方法掌握通过地址前缀列表过滤路由信息的配置方法掌握通过Route-policy过滤路由信息的配置方法 拓扑图 场景 你是你们公司的网络管理员。公司网络中有两部分路由区域,一部分运行OSPF,另外…

【Proteus仿真】【51单片机】厨房天然气泄漏检测报警系统

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用LCD1602、按键、天然气、烟雾传感器、ADC,报警模块等。 系统运行后,LCD1602显示传感器检测的天然气浓度和烟雾浓度值。 可通…

中国土地交易数据库:300w数据中国土地高频交易数据2000-2022

土地交易是土地在流通过程中多方发生的经济关系,土地交易的行为主要是交换的土地所有权、使用权、租赁权、抵押权等。在我国,土地作为一种重要资源,其收购储备和交易行为都由国家进行统一管理。经过改革开放几十年的探索和实践,土…

手机投影到电脑显示 此设备不支持miracast,因此不能以无线投影到它

在家里使用手机的体感游戏,发现手机屏幕比较小,想要将其投影到自己的笔记本电脑上,这样看得就比较大了。然后我就打开笔记本电脑,操作如下: 如下图: 原文地址:手机投影到电脑显示 此设备不支持miracast,因此不能以无线投影到它 - 廖强的博客 但是结果我们就看到了…

Mysql安装配置和Mysql使用六千字详解!!

目录 课前导读 一、Mysql的安装和配置 二、数据库简介: 1、数据库中典型代表: 2、数据库类型: 3、Mysql简介: 4、客户端和服务器简介: 三、初始MySQL 四、数据库操作 五、表的基本操作 六、表的基础增删查改…

虚拟主机、WordPress 主机和云主机之间的区别

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网站】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且…

[附源码]JAVA毕业设计校园失物招领管理系统(系统+LW)

[附源码]JAVA毕业设计校园失物招领管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

港科夜闻|罗康锦教授获委任为香港科大工学院院长

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、罗康锦教授获委任为香港科大工学院院长。该委任任期由2023年1月1日开始。罗康锦教授服务香港科大多年,是智慧交通系统、智慧城市和可持续发展的杰出学者,在学术研究方面屡获殊荣。罗教授拥有丰富的学…

阿里巴巴内部最新发布SpringCloud ALiBaBa全彩版

就在昨天,阿里巴巴发布了最新的SpringCloud ALiBaBa全解第三版同时也是全彩版,话不多说我们直接来看干货! 由于文章的篇幅有限,下面只能为大家展示目录内容,需要领取完整版可以文末免费获取章节目录 微服务介绍 微服务…

Go 实现插入排序算法及优化

Go 实现插入排序算法及优化插入排序算法实现算法优化小结耐心和持久胜过激烈和狂热。 哈喽大家好,我是陈明勇,今天分享的内容是使用 Go 实现插入排序算法。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨…

python基于SVM的疫情评论情感数据分析

1、构建SVM情感分析模型 读取数据 使用pandas的库读取微薄数据读取并使进行数据打乱操作 import pandas as pd test pd.read_csv(".\\weibo.csv") test_data pd.DataFrame(test)[:1000] test_data 打乱数据 re_test_data test_data.sample(frac1).reset_index(…

代码随想录训练营第44天|完全背包、LeetCode 518. 零钱兑换 II、 377. 组合总和 Ⅳ

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

前端工程化实践——快速入门treeshaking

treeshaking treeshaking本质是去除多余代码算法。在前端的性能优化中,es6 推出了tree shaking机制,tree shaking就是当我们在项目中引入其他模块时,他会自动将我们用不到的代码,或者永远不会执行的代码摇掉,在…

【Java设计模式】用盖房子案例讲解建造者模式(生成器模式)

一、前言 今天学习了Java设计模式中的建造者模式,细心整理了学习笔记以及对这个模式的自我理解,希望大家喜欢! 二、需求介绍 现在我们需要建房子,过程为打桩、砌墙、封顶。房子有各种各样的,比如普通房,…