这是关于如何在训练前向模型添加现有权重的问题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
}
}
我的问题是:
底部和顶部参数究竟是什么?
我是否需要在后续两个图层中更改“loss3 / classifier”的名称?
答案 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是三个完全不同的网络。