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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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