您好我想知道如何在原型文件中使用SPP Layer。 也许有人可以向我解释如何阅读caffe文档,因为有时我很难直接理解它。
我的尝试基于此protofile,但我认为它与当前版本不同?
我定义了这样的图层:
layers {
name: "spatial_pyramid_pooling"
type: "SPP"
bottom: "conv2"
top: "spatial_pyramid_pooling"
spatial_pyramid_pooling_param {
pool: MAX
spatial_bin: 1
spatial_bin: 2
spatial_bin: 3
spatial_bin: 6
scale: 1
}
}
当我尝试开始学习时,收到以下错误消息:
[libprotobuf ERROR google/protobuf/text_format.cc:287] Error parsing text-format caffe.NetParameter: 137:9: Expected integer or identifier, got: "SPP"
F0714 13:25:38.782958 2061316096 upgrade_proto.cpp:88] Check failed: ReadProtoFromTextFile(param_file, param) Failed to parse NetParameter file:
完整原型文件(Lenet批量批量规范化和SPP):
name: "TessDigitMean"
layer {
name: "input"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {
source: "/Users/rvaldez/Documents/Datasets/Digits/SeperatedProviderV3_1020_batchnormalizedV2AndSPP/1/caffe/train_lmdb"
batch_size: 64
backend: LMDB
}
}
layer {
name: "input"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
scale: 0.00390625
}
data_param {
source: "/Users/rvaldez/Documents/Datasets/Digits/SeperatedProviderV3_1020_batchnormalizedV2AndSPP/1/caffe/test_lmdb"
batch_size: 10
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 20
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "bn1"
type: "BatchNorm"
bottom: "pool1"
top: "bn1"
batch_norm_param {
use_global_stats: false
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
include {
phase: TRAIN
}
}
layer {
name: "bn1"
type: "BatchNorm"
bottom: "pool1"
top: "bn1"
batch_norm_param {
use_global_stats: true
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
include {
phase: TEST
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "bn1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 50
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layers {
name: "spatial_pyramid_pooling"
type: "SPP"
bottom: "conv2"
top: "spatial_pyramid_pooling"
spatial_pyramid_pooling_param {
pool: MAX
spatial_bin: 1
spatial_bin: 2
spatial_bin: 3
spatial_bin: 6
scale: 1
}
}
layer {
name: "bn2"
type: "BatchNorm"
bottom: "spatial_pyramid_pooling"
top: "bn2"
batch_norm_param {
use_global_stats: false
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
include {
phase: TRAIN
}
}
layer {
name: "bn2"
type: "BatchNorm"
bottom: "pool2"
top: "bn2"
batch_norm_param {
use_global_stats: true
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
include {
phase: TEST
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "bn2"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 10
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}
答案 0 :(得分:2)
好的,我找到了。
定义SPP图层的正确方法如下:
layer {
name: "spatial_pyramid_pooling"
type: "SPP"
bottom: "conv2"
top: "pool2"
spp_param {
pyramid_height: 2
}
}
请注意,我之前写过layers
而不是layer
。
此外,您可以在spp_param{}
内指定此图层的参数。
caffe的官方版本没有垃圾箱作为选项,而是金字塔高度。所以我第一次尝试的版本基于,是不正确的。
对于我自己和任何对caffe不熟悉并且对文档风格有点困惑的人都有一些注意事项。
<强>文档:强>
- 图层类型:SPP
...
message SPPParameter {
enum PoolMethod {
MAX = 0;
AVE = 1;
STOCHASTIC = 2;
}
optional uint32 pyramid_height = 1;
optional PoolMethod pool = 2 [default = MAX]; // The pooling method
enum Engine {
DEFAULT = 0;
CAFFE = 1;
CUDNN = 2;
}
optional Engine engine = 6 [default = DEFAULT];
}
备注:强>
图层类型定义关键字以声明proto文件中图层的类型(如果您知道,则为逻辑类型)
Enums
是parameter
的可能值。
无法在与类型或名称相同的级别上定义参数。相反,您必须将其包含在layerspecifc参数关键字(spp_param
)中。
此关键字的构建方式与<layertype>_param{}
小写字母相似。