在caffe中,我创建了一个简单的网络来对面部图像进行分类,如下所示:
myExampleNet.prototxt
name: "myExample"
layer {
name: "example"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/myExample/myExample_train_lmdb"
batch_size: 64
backend: LMDB
}
}
layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/myExample/myExample_test_lmdb"
batch_size: 100
backend: LMDB
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "data"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 50
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: 155
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"
}
myExampleSolver.prototxt
net: "examples/myExample/myExampleNet.prototxt"
test_iter: 15
test_interval: 500
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 30000
snapshot: 5000
snapshot_prefix: "examples/myExample/myExample"
solver_mode: CPU
我使用convert_imageset
caffe来创建LMDB数据库,我的数据有大约40000个训练和16000个测试数据。 155个案例,每个案例分别有260和100个列车和测试图像。
我使用此命令训练数据:
build/tools/convert_imageset -resize_height=100 -resize_width=100 -shuffle examples/myExample/myData/data/ examples/myExample/myData/data/labels_train.txt examples/myExample/myExample_train_lmdb
和测试数据的命令:
build/tools/convert_imageset -resize_height=100 -resize_width=100 -shuffle examples/myExample/myData/data/ examples/myExample/myData/data/labels_test.txt examples/myExample/myExample_test_lmdb
但是经过30000次迭代后,我的损失很高,而且准确度很低:
...
I0127 09:25:55.602881 27305 solver.cpp:310] Iteration 30000, loss = 4.98317
I0127 09:25:55.602917 27305 solver.cpp:330] Iteration 30000, Testing net (#0)
I0127 09:25:55.602926 27305 net.cpp:676] Ignoring source layer example
I0127 09:25:55.827739 27305 solver.cpp:397] Test net output #0: accuracy = 0.0126667
I0127 09:25:55.827764 27305 solver.cpp:397] Test net output #1: loss = 5.02207 (* 1 = 5.02207 loss)
当我将数据集更改为mnist并将ip2
图层num_output
从155更改为10时,损失会大大减少,准确度会提高!
哪一部分错了?
答案 0 :(得分:0)
代码中不一定有问题。
你对MNIST获得这些好结果的事实说你确实有一个“正确”的模型,因为它不会产生编码错误等,但它绝不保证它会表现良好另一个不同的问题。
请记住,原则上,预测10级问题(如MNIST)比155级问题更容易 ;第一种情况下的基线(即简单随机猜测)精度约为10%,而第二种情况仅为约0.65%。再加上您的数据大小(与MNIST相当)也不大(它们是 color 图片,即3通道与单通道MNIST相比?),您的结果可能会开始那令人费解和令人惊讶。
另外,事实证明MNIST非常容易适应(我一直在努力构建那些不非常适合MNIST的模型,到目前为止没有取得多大成功),并且您很容易达到结论现在已成为社区的共识,即MNIST的良好表现并未对模型架构起到太多作用。