我修改了Caffe的MNIST示例,以对三类图像进行分类。我注意到,如果我将输出层的数量设置为3,那么测试准确率会急剧下降,降至40%左右。然而,如果我将输出层数量增加1,设为4,准确率则能达到95%左右。
我还向数据集中添加了第四类图像(因此总共有4类),并观察到同样的现象——如果输出层的数量与类别数量相同,结果会很差;如果输出层的数量比类别数量多1,结果则非常好。
inner_product_param { num_output: 3 weight_filler { type: "xavier" } bias_filler { type: "constant"
有谁知道这是为什么吗?我注意到,当我使用C++示例代码训练的模型对测试集中的图像进行分类时,程序会抱怨说我告诉它有4个类别存在,而我在标签文件中只提供了3个标签。如果我编造一个标签并将其添加到文件中,我可以让程序运行,但无论我提供什么图像,它都会返回其中一个类别的概率为1.0。
回答:
需要注意的是,在微调和/或更改标签数量时,输入标签必须始终从0开始,因为它们在计算损失时被用作输出概率向量的索引。
因此,如果你有
inner_product_params { num_output: 3 }
你必须只有训练标签0、1和2。
如果你使用num_output: 3
和标签1、2、3,Caffe无法表示标签3,实际上有一条对应于标签0的冗余行未被使用。
正如你所观察到的,当更改为num_output: 4
时,Caffe再次能够表示标签3,结果有所改善,但参数矩阵中仍然有一行未被使用。