2017-05-03 31 views
2

这是关于如何在训练之前将现有权重添加到模型的问题here的扩展。更改caffe中的最后一层

我想使用现有的权重,但我的最终图层输出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

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


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

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

的该层执行"InnerProduct"操作(通过层type定义)。它在输入数据块"pool5/7x7_s1"(定义为bottom)上执行操作,并将结果输出到数据块"loss3/classifier"(定义为top数据块)。该图层的可学习参数(权重和偏差)由caffe使用图层名称"loss3/classifier"进行存储和访问。
因此,如果您更改layyer的"loss3/classifier_50"改变top,你会得到想要的效果:朱古力不会复制他的权重这一层的,但将保持连接到其他层这一层的输出。


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

+1

啊是的。你是对的。这是googlenet。我对这样的基本问题表示歉意。我一定会浏览教程。谢谢! – MoneyBall