更改caffe中的最后一层

时间:2017-05-03 06:10:22

标签: machine-learning neural-network deep-learning caffe

这是关于如何在训练前向模型添加现有权重的问题here的扩展。

我想使用现有的权重,但我的最终图层输出50而不是1000(因为网络经过培训可以对1000个项目进行分类)。从上一篇文章中,通过更改输出图层的名称,我可以添加权重。但后来我意识到还有其他层依赖于最后一层。以下是VGG网络的片段:

 layer {
   name: "loss3/classifier"
   type: "InnerProduct"
   bottom: "pool5/7x7_s1"
   top: "loss3/classifier"
   param {
     lr_mult: 1
     decay_mult: 1
   }
   param {
     lr_mult: 2
     decay_mult: 0
   }
   inner_product_param {
     num_output: 50
     weight_filler {
       type: "xavier"
     }
     bias_filler {
       type: "constant"
       value: 0
     }
   }
 }
 layer {
   name: "loss3/loss3"
   type: "SoftmaxWithLoss"
   bottom: "loss3/classifier"
   bottom: "label"
   top: "loss3/loss3"
   loss_weight: 1
 }
 layer {
   name: "loss3/top-1"
   type: "Accuracy"
   bottom: "loss3/classifier"
   bottom: "label"
   top: "loss3/top-1"
   include {
     phase: TEST
   }
 }
 layer {
   name: "loss3/top-5"
   type: "Accuracy"
   bottom: "loss3/classifier"
   bottom: "label"
   top: "loss3/top-5"
   include {
     phase: TEST
   }
   accuracy_param {
     top_k: 5
   }
 }

我的问题是:

  1. 底部和顶部参数究竟是什么?

  2. 我是否需要在后续两个图层中更改“loss3 / classifier”的名称?

1 个答案:

答案 0 :(得分:1)

这是一个非常基本的问题。我强烈建议您阅读一些文档和基本的caffe教程,以获得caffe的基础知识。 This tutorial可以是一个很好的起点。

深度网络有一个底层图形描述"流程"从网络输入到预测输出的数据。您在问题中附加的代码段描述了一个这样的图表 每一层代表一个处理单元"沿着"数据路径":它的输入是"bottom" blob(s),图层将其处理后的数据作为"top" blob输出。
所以,如果你有一个图层

layer {
  name: "loss3/classifier"
  type: "InnerProduct"
  bottom: "pool5/7x7_s1"
  top: "loss3/classifier"
  ...
}

此图层执行"InnerProduct"操作(由图层type定义)。它对输入blob "pool5/7x7_s1"(定义为bottom)执行操作,并将结果输出到blob "loss3/classifier"(定义为top blob)。 caffe使用图层的名称"loss3/classifier"存储和访问此图层的可学习参数(权重和偏差)。
因此,如果您将外行人的名称更改为"loss3/classifier_50" 而不更改top,您将获得所需的效果:caffe不会复制此图层的权重,但会保持此图层的输出连接到其他图层。

顺便说一句,
你确定你使用的是VGG网吗?这个原型文看起来像GoogLeNet架构...... 请注意,AlexNet,VGG和GoogLeNet是三个完全不同的网络。