BCELoss【错了跟我讲,我可以改,一起学】
用于二分类问题,计算loss值,与sigmoid函数一起使用(就是逻辑回归的那个公式,线性外面套一个sigmoid函数)
参考文档
理解
看它的参数说明大概能知道:
参数
- weight(张量*,*可选)–对每个批次元素的损失赋予的手动重新缩放重量。如果给定,则必须是大小为nbatch的张量。
- size_average(bool*,*可选)–已弃用(请参阅
reduction
)。默认情况下,损失是批次中每个损失元素的平均数。请注意,对于某些损失,每个样本有多个元素。如果该字段size_average
设置为False
,则每个小批量的损失总和。何时reduce
被忽略False
。默认:True
- reduce(bool*,*可选)–不推荐使用(请参阅
reduction
)。默认情况下,根据,对每个小批量的损失进行平均或求和size_average
。当reduce
为is时False
,则返回每批元素的损失,然后忽略size_average
。默认:True
- reduction(字符串*,*可选)–指定要应用于输出的减少量:
'none'
|'mean'
|'sum'
。'none'
:不应用缩减,'mean'
:输出的总和除以输出中元素的数量,'sum'
:输出的总和。注意:size_average
和reduce
正在弃用的过程中,同时,指定这两个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 )}]')