caffe softmaxwithloss有两个输出,一个loss,一个probs,失败

caffe softmaxwithloss有两个输出,一个loss,一个probs,生成失败,看代码是允许两个输出的呀,有木有人遇到这种问题?
已邀请:

phoenixbai

赞同来自: alex68 wxh0001 xinmiao

查了一下,代码有bug。呵呵
原因是这样的,softmax_loss_layer生成时,会先生成softmax_layer,而这两个layer会共享同一个layer_parameter. 这意味着,也会共享里面的loss_weight的参数。
 
而softmax_layer只会生成一个top,这个不是由用户控制的,是代码里写死的,这逻辑没有问题,
softmax_loss_layer的top,是用户可以设置的,不设,默认1,设了最多可设两个,比如你现在要干的事儿。
问题出现,每次生成一个layer时,系统都会去干一件SetLossWeights的事儿,(layer.hpp)这函数就是在check你的top数量是否与loss_weight匹配。关键在于,无论你是什么类型的layer,这货都会被调,因为它是写在父类layer.cpp里的。
 
这就意味着,当你生成softmax_layer时它会调一次,此时,若layer_parameter里,你设了两个loss_weight,它会报错: Check failed: top.size() == num_loss_weights (1 vs 2). 若你只写一个或没有写,那softmax_layer生成是成功的。
 
接着生成softmax_loss_layer时,它会再次被调用,此时,你的top是设了两个的,而你的loss_weight,生了两个,则上一步就挂了,走不到这儿,若生了一个或不设,默认系统给你设一个,那它还是会报错说:Check failed: top.size() == num_loss_weights (2 vs 1).
 
呵呵,所以,你是不改代码跳不出这个坑的。
 
解决方案,可以有多种,比如:
1) 在softmax_layer里override SetLossWeights函数,让它不会做check,这是合理的,毕竟loss_weight只是针对loss_layer的。
2) 在共享的layer_parameter上动手脚,即softmax_layer用这个参数时,可以把loss_weight干掉,但这个可能有写死逻辑的嫌疑,所以慎用吧。主要是不太美观。
 
其它自行歪歪。

alex68 - 一般不扯淡~

赞同来自:

因垂丝汀! mark一下 回去我也看看这块的源码

要回复问题请先登录注册