softmax 加温度系数 tempreture

假设某分类网络有10个类,输出的得分为 logits,我们仅考虑1batch_size的情况,即 logits 可以理解为 float数组 logits[10]. 

logits经过softmax对应得到的标签值 preds 的公式为:

                                      preds[j] = \frac{e^{logits[j]}}{ \sum_{i=0}^{10} e^{logits[i]}} \qquad j=0,2,...,9

如果加上温度系数,则公式写为:

                                    preds[j] = \frac{e^{\frac{logits[j]}{temp}}}{ \sum_{i=0}^{10} e^{\frac{logits[i]}{temp}}} \qquad j=0,2,...,9

 是不是看起来不直观,我们来画个图看下加温度系数temp前后preds值得变化。

注:为了看起来更直观 logits[10]我取了标准正态分布,设temp=0.01。

图左为没有温度系数temp(也可以理解为temp=1)的preds数组柱状图,图右为加了温度系数temp=0.01的preds柱状图。

取更小的温度系数temp,标签值preds会变得更加尖锐化。使问题更加趋向于非黑即白的情况。

以下是相应的python代码:

import random
import matplotlib.pyplot as plt
import torch
import torch.nn.functional as F
import numpy as np

mixed_target = torch.ones((10))
mixed_target = mixed_target/10.0

mixed_temp = torch.ones((10))
mixed_temp = mixed_temp/100.0
logits = torch.randn((10))
logits = logits/100.0

preds = F.softmax(logits, dim=0)
preds_n = preds.numpy()
preds = torch.clamp(preds, min=1e-8)
preds = torch.log(preds)
loss = -torch.mean(torch.sum(mixed_target * preds, dim=0))

preds_t = F.softmax(logits / mixed_temp, dim=0)
preds_nt = preds_t.numpy()
preds_t = torch.clamp(preds_t, min=1e-8)
preds_t = torch.log(preds_t)
loss_t = -torch.mean(torch.sum(mixed_target * preds_t, dim=0))


X_set = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
p1 = plt.bar(X_set, np.around(preds_n, 3), width=0.35, label='value')
plt.bar_label(p1, label_type='edge')
plt.title('The distribution of softmax')
plt.show()

p2 = plt.bar(X_set, np.around(preds_nt, 3), width=0.35, label='value')
plt.bar_label(p2, label_type='edge')
plt.title('The distribution of softmax with tempreture')
plt.show()


p3 = plt.bar(['temp', 'no_temp'], [loss_t, loss], width=0.35, label='value')
plt.bar_label(p3, label_type='edge')
plt.title('The distribution of softmax with tempreture')
plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SinAlone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值