使用caffe的神经网络精度低
low accuracy in neural network with caffe
我在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 时,损失显着减少并且准确性提高!
哪一部分是错误的?
您的代码不一定有问题。
您为 MNIST 获得这些好结果的事实确实表明您拥有一个 'correct' 的模型,因为它不会产生编码错误等,但它绝不保证它将在另一个不同的问题中表现良好。
请记住,原则上,预测 10-class 问题(如 MNIST)比预测 155-class 更容易 ] 一;第一种情况下的基线(即简单随机猜测)准确度约为 10%,而第二种情况仅为 ~ 0.65%。补充一下你的数据大小(与 MNIST 相比)也不大(它们是否也是 color 图片,即与单通道 MNIST 对比的 3 通道?),你的结果可能开始看起来不那么令人费解和惊讶了。
此外,事实证明 MNIST 是出了名的容易拟合(我一直在尝试自己构建 不 很好地拟合 MNIST 的模型,到目前为止没有取得太大成功) ,你很容易得出一个结论,这个结论现在已经成为社区的常识,即 MNIST 上的良好表现并不能说明模型架构的真正意义。
我在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 时,损失显着减少并且准确性提高!
哪一部分是错误的?
您的代码不一定有问题。
您为 MNIST 获得这些好结果的事实确实表明您拥有一个 'correct' 的模型,因为它不会产生编码错误等,但它绝不保证它将在另一个不同的问题中表现良好。
请记住,原则上,预测 10-class 问题(如 MNIST)比预测 155-class 更容易 ] 一;第一种情况下的基线(即简单随机猜测)准确度约为 10%,而第二种情况仅为 ~ 0.65%。补充一下你的数据大小(与 MNIST 相比)也不大(它们是否也是 color 图片,即与单通道 MNIST 对比的 3 通道?),你的结果可能开始看起来不那么令人费解和惊讶了。
此外,事实证明 MNIST 是出了名的容易拟合(我一直在尝试自己构建 不 很好地拟合 MNIST 的模型,到目前为止没有取得太大成功) ,你很容易得出一个结论,这个结论现在已经成为社区的常识,即 MNIST 上的良好表现并不能说明模型架构的真正意义。