这是这里关于如何在训练前向模型中添加现有权重的问题的扩展。
我想使用现有的权重,但我的最后一层输出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
}
}我的问题是:
发布于 2017-05-03 06:31:21
这是一个相当基本的问题。我强烈建议您阅读一些文档和基本的caffe教程,以获得caffe的基础知识。本教程可以是一个很好的起点。
深层网络有一个底层图,描述从网络输入到预测输出的“数据流”。您在问题中附加的片段描述了这样一个图表。
每个层表示沿“数据路径”的“处理单元”:它的输入是"bottom" blob,该层以"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是三个完全不同的网。
https://stackoverflow.com/questions/43752315
复制相似问题