Caffe: 使用Scale层添加Softmax温度

我试图在Caffe中实现一个带有“温度”参数的Softmax层。我正在实现一个使用这里概述的蒸馏技术的网络。

本质上,我希望我的Softmax层使用如下带温度的Softmax函数:

F(X) = exp(zi(X)/T) / sum(exp(zl(X)/T))

使用这个函数,我希望能够在训练前调整温度T。我找到了一个类似的问题,但那个问题试图在部署网络上实现带温度的Softmax。我在实现第一个答案中描述为“选项4”的额外Scale层时遇到了困难。

我使用的是Caffe示例目录中找到的cifar10_full_train_test prototxt文件。我尝试进行了以下更改:

原版

.........layer {  name: "accuracy"  type: "Accuracy"  bottom: "ip1"  bottom: "label"  top: "accuracy"  include {    phase: TEST  }}layer {  name: "loss"  type: "SoftmaxWithLoss"  bottom: "ip1"  bottom: "label"  top: "loss"}

修改版

.........layer {  name: "accuracy"  type: "Accuracy"  bottom: "ip1"  bottom: "label"  top: "accuracy"  include {    phase: TEST  }}layer {  type: "Scale"  name: "temperature"  top: "zi/T"  bottom: "ip1"  scale_param {    filler: { type: 'constant' value: 0.025 } ### 我希望T = 40,所以1/40=.025  }  param { lr_mult: 0 decay_mult: 0 }}layer {  name: "loss"  type: "SoftmaxWithLoss"  bottom: "ip1"  bottom: "label"  top: "loss"}

经过快速训练(5,000次迭代)后,我检查了分类概率是否看起来更均匀,但实际上它们似乎分布得更不均匀了。

例如:

高温T: F(X) = [0.2, 0.5, 0.1, 0.2]

低温T: F(X) = [0.02, 0.95, 0.01, 0.02]

~我的尝试: F(X) = [0, 1.0, 0, 0]


我的实现看起来是正确的吗?无论如何,我遗漏了什么?


回答:

你没有使用你的"Scale"层产生的“冷却”预测"zi/T"

layer {  name: "loss"  type: "SoftmaxWithLoss"  bottom: "zi/T"  # 使用“冷却”预测而不是原始预测。  bottom: "label"  top: "loss"}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注