专栏首页深度学习那些事儿A trap of parameter 'size_average' in pytorch

A trap of parameter 'size_average' in pytorch

pytorch的入门教程中有这样的一句:

loss = torch.nn.MSELoss(size_average=True)
input = Variable(torch.ones(2,2), requires_grad=True)
target = Variable(torch.Tensor([[3,3],[3,3]]))
output = loss(input, target)
output.backward()

上面的程序很简单,设定一个loss函数,然后设定一个input和target进行loss计算,然后再backward。

这里我们不看反向过程,只看output的值是多少:

Variable containing:
 4
[torch.FloatTensor of size 1]

这个4是output的值,可以看到这个值是一个scalar而并不是一个向量。

我们再来看一段程序:

loss = torch.nn.MSELoss(size_average=False)
input = Variable(torch.ones(2,2), requires_grad=True)
target = Variable(torch.Tensor([[3,3],[3,3]]))
output = loss(input, target)
output.backward()
output

Out[11]: 
Variable containing:
 16
[torch.FloatTensor of size 1]

同样一段程序,怎么就变成16了,原因是在设置loss函数中我们把参数size_average设为了False。

当size_average为Ture的时候,我们得到4,反之我们得到16,结合size_average参数的官方解释:

size_average (bool, optional): By default, the losses are averaged over
    observations for each minibatch. However, if the field size_average
    is set to False, the losses are instead summed for each minibatch.

也就是说True的loss除以了loss的数量(此处n=4),False的时候loss为summed的也就是全部loss的总和。

size_average参数默认为True,也就是说我们平时计算的时候得到的loss是平均loss。

这样会出现怎么问题呢:

这个参数默认是True,我们平时的训练集都是规整的,也就是说训练集中的每个类数量几乎差不多的训练集,然后我们算出了损失,比如这个损失是个[10]的Tensor,这里的10就是你之前说的N 也就是分类的数量,这个参数设为True则在得出的所有loss中除以N 如果为Flase则不处理直接把所有类的loss直接加起来给你。这个平时加起来和除以N在实际计算中影响不大,但是如果是别的任务 比如RNN 这时候分类loss就需要权重了。每个分类的loss的权重系数应该不一样,或者说训练集中某些类的数据没有另一类多,得出的损失有可能也有缺陷也需要参数,这时在pytorch中我们就无能为力了,因为其只能输出平均或者总和的loss 不能输出a batch of losses 也就是一个类一个损失,这种输出后期我们可以自由处理 。所以说这个是pytorch的一个缺陷 ,在github中的issue中有人提出来了。pytorch的编写人员回复说正在修改底层。

更新:在pytorch0.3中部分损失函数已经得到修改!

另外几个问题:

如何自定义不同权重loss:https://github.com/pytorch/pytorch/issues/563

loss中奇怪的问题:https://discuss.pytorch.org/t/the-default-value-of-size-average-true-in-loss-function-is-a-trap/4251

How to combine multiple criterions to a loss function? Get loss for individual samples losses per-batch-element:https://github.com/pytorch/pytorch/issues/264

此文由腾讯云爬虫爬取,文章来源于Oldpan博客

欢迎关注Oldpan博客公众号,持续酝酿深度学习质量文:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深度学习中数据集很小是一种什么样的体验

    今天提一个比较轻松的话题,简单探讨数据集大小对深度学习训练的影响。 不知道大家有没有看过这篇文章:Don’t use deep learning your d...

    OLDPAN
  • 浅谈深度学习的落地问题

    关于深度学习人工智能落地,已经有有很多的解决方案,不论是电脑端、手机端还是嵌入式端,将已经训练好的神经网络权重在各个平台跑起来,应用起来才是最实在的。

    OLDPAN
  • pytorch新手需要注意的隐晦操作Tensor,max,gather

    先看官方的介绍: 如果input是一个n维的tensor,size为 (x0,x1…,xi−1,xi,xi+1,…,xn−1),dim为i,然后index必须...

    OLDPAN
  • pytorch进行CIFAR-10分类(4)训练

    经过前面的数据加载和网络定义后,就可以开始训练了,这里会看到前面遇到的一些东西究竟在后面会有什么用,所以这一步希望各位也能仔细研究一下

    TeeyoHuang
  • ServletContext与Web应用以及Spring容器启动

    Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象。

    良月柒
  • Python爬虫(十九)_动态HTML介绍

    JavaScript JavaScript是网络上最常用也是支持者对多的客户端脚本语言。它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文...

    用户1174963
  • Deep learning with Python 学习笔记(5)

    用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet) 与其他所...

    范中豪
  • 短视频旋转图像,原来如此简单!不用编辑器,1键搞定

    但是有时候竖屏拍摄的图像,或者横屏拍摄的图像想要进行旋转,做一些特效,进行二次加工的时候,需要耗费很多的时间。

    程序员小助手
  • TensorFlow之estimator详解

    在介绍Estimator之前需要对它在TensorFlow这个大框架的定位有个大致的认识,如下图示:

    marsggbo
  • TensorFlow之estimator详解

    在介绍Estimator之前需要对它在TensorFlow这个大框架的定位有个大致的认识,如下图示:

    marsggbo

扫码关注云+社区

领取腾讯云代金券