如何在Caffe的net.cpp中将netwrok层定义为输出?

时间:2018-11-29 05:51:49

标签: deep-learning caffe

我大致知道网络的输出是在net.cpp Init中定义的。

void Net<Dtype>::Init(const NetParameter& in_param)

确切地在第240行。

// In the end, all remaining blobs are considered output blobs.
  for (set<string>::iterator it = available_blobs.begin();
      it != available_blobs.end(); ++it) {
    LOG_IF(INFO, Caffe::root_solver())
        << "This network produces output " << *it;
    net_output_blobs_.push_back(blobs_[blob_name_to_idx[*it]].get());
    net_output_blob_indices_.push_back(blob_name_to_idx[*it]);
  }

我有一个使用Inception Net的自定义网络,用于更快的rcnn方法。

我的网络有五个用于RPN的卷积层。 然后,RCNN具有两个初始层和一个FC层。

现在的问题是在输出中考虑了第二个起始层。 日志文件显示为

I1129 13:21:48.189395 24653 net.cpp:243] This network produces output loss_bbox
I1129 13:21:48.189399 24653 net.cpp:243] This network produces output loss_cls
I1129 13:21:48.189404 24653 net.cpp:243] This network produces output rpn_cls_loss
I1129 13:21:48.189407 24653 net.cpp:243] This network produces output rpn_loss_bbox
I1129 13:21:48.189411 24653 net.cpp:243] This network produces output tower_2/conv
I1129 13:21:48.189415 24653 net.cpp:243] This network produces output tower_2/tower1/conv1_1
I1129 13:21:48.189419 24653 net.cpp:243] This network produces output tower_2/tower2/conv2_2

我不明白为什么第二个盗用层被视为输出。

我的网络体系结构出了什么问题?

可以看到我的整个网络here

1 个答案:

答案 0 :(得分:0)

您的第二个起始层的最终输出是ReLU激活:

layer {
  name: "tower_2/tower2/conv2_2_relu"
  type: "ReLU"
  bottom: "tower_2/tower2/conv2_2"
  top: "tower_2/tower2/conv2_2"
}

哪个产生top的{​​{1}}。此顶部未作为底部连接到任何其他层,因此自动视为输出。