pytorch交叉熵损失函数的weight参数的使⽤
⾸先
必须将权重也转为Tensor的cuda格式;
然后
将该class_weight作为交叉熵函数对应参数的输⼊值。
class_weight=ensor([0.13859937,0.5821059,0.63871904,2.30220396,7.1588294,0]).cuda()
补充:关于pytorch的CrossEntropyLoss的weight参数
⾸先这个weight参数⽐想象中的要考虑的多
你可以试试下⾯代码
importtorch
inputs=ensor([0,1,0,0,0,1])
outputs=nsor([0,1])
inputs=((1,3,2))
outputs=((1,2))
weight_CE=ensor([1,1,1])
ce=ntropyLoss(ignore_index=255,weight=weight_CE)
loss=ce(inputs,outputs)
print(loss)
tensor(1.4803)
这⾥的⼿动计算是:
loss1=0+ln(e0+e0+e0)=1.098
loss2=0+ln(e1+e0+e1)=1.86
求平均=(loss1*1+loss2*1)/2=1.4803
加权呢?
importtorch
inputs=ensor([0,1,0,0,0,1])
outputs=nsor([0,1])
inputs=((1,3,2))
outputs=((1,2))
weight_CE=ensor([1,2,3])
ce=ntropyLoss(ignore_index=255,weight=weight_CE)
loss=ce(inputs,outputs)
print(loss)
tensor(1.6075)
⼿算发现,并不是单纯的那权重相乘:
loss1=0+ln(e0+e0+e0)=1.098
loss2=0+ln(e1+e0+e1)=1.86
求平均=(loss1*1+loss2*2)/2=2.4113
⽽是
loss1=0+ln(e0+e0+e0)=1.098
loss2=0+ln(e1+e0+e1)=1.86
求平均=(loss1*1+loss2*2)/3=1.6075
发现了么,加权后,除以的是权重的和,不是数⽬的和。
我们再验证⼀遍:
importtorch
inputs=ensor([0,1,2,0,0,0,0,0,0,1,0,0.5])
outputs=nsor([0,1,2,2])
inputs=((1,3,4))
outputs=((1,4))
weight_CE=ensor([1,2,3])
ce=ntropyLoss(weight=weight_CE)
#ce=ntropyLoss(ignore_index=255)
loss=ce(inputs,outputs)
print(loss)
tensor(1.5472)
⼿算:
loss1=0+ln(e0+e0+e0)=1.098
loss2=0+ln(e1+e0+e1)=1.86
loss3=0+ln(e2+e0+e0)=2.2395
loss4=-0.5+ln(e0.5+e0+e0)=0.7943
求平均=(loss1*1+loss2*2+loss3*3+loss4*3)/9=1.5472
可能有⼈对loss的CE计算过程有疑问,我这⾥细致写写交叉熵的计算过程,就拿最后⼀个例⼦的loss4的计算说明
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
本文发布于:2022-12-26 17:22:15,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/35008.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |