pytorch_BCELoss的reduction参数理解

162 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

文章目录

BCELoss【错了跟我讲,我可以改,一起学】

用于二分类问题,计算loss值,与sigmoid函数一起使用(就是逻辑回归的那个公式,线性外面套一个sigmoid函数)

参考文档

pytorch-BCELoss

理解

看它的参数说明大概能知道:

参数

  • weight张量*,*可选)–对每个批次元素的损失赋予的手动重新缩放重量。如果给定,则必须是大小为nbatch的张量。
  • size_averagebool*,*可选)–已弃用(请参阅reduction)。默认情况下,损失是批次中每个损失元素的平均数。请注意,对于某些损失,每个样本有多个元素。如果该字段size_average 设置为False,则每个小批量的损失总和。何时reduce被忽略False。默认:True
  • reducebool*,*可选)–不推荐使用(请参阅reduction)。默认情况下,根据,对每个小批量的损失进行平均或求和size_average。当reduce为is时False,则返回每批元素的损失,然后忽略size_average。默认:True
  • reduction字符串*,*可选)–指定要应用于输出的减少量: 'none'| 'mean'| 'sum''none':不应用缩减, 'mean':输出的总和除以输出中元素的数量,'sum':输出的总和。注意:size_averagereduce正在弃用的过程中,同时,指定这两个args中的任何一个将覆盖reduction。默认:'mean'

**理解:**我们一般只用reduction这个参数,有两个选择:

  • 'mean':输出的总和除以输出中元素的数量 【以batch、迭代次数为单位进行一次计算】
  • 'sum':输出的总和 【以单位样本个体进行一次计算】

我们需要查看其loss,一般在一个epoch中,要么每个batch输出一次,要么隔n个batch输出一次,因此,

如果使用mean(默认为mean),表示已经做了均值处理,只需要total_loss除以n(迭代次数)就可以;

如果使用sum,表示没有除以该batch中的样本数,则需要total_loss除以(n*batch_size)【最后一下如果不能整除,自然也就不会进行这一步的total_loss转loss计算】

代码如下:

 total_loss += loss.item()
 if i % 3 == 0:
 	# print("len(trainLoader):", len(trainLoader))
 	# print("len(x)", len(x))
 	print(f'[{time_since(start)}] Epoch {epoch} ', end='')
 	print(f'[{i * len(x[0])}/{len(trainSet)}] ', end='')
 	print(f'loss = {total_loss / (i * len(x[0]))} ', end='')
 	print(f'loss = {total_loss / (i)} ', end='')
 	print(f'[{total_loss} / {(i )}]')