使用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 并将 ip2num_output 从 155 更改为 10 时,损失显着减少并且准确性提高!

哪一部分是错误的?

您的代码不一定有问题。

您为 MNIST 获得这些好结果的事实确实表明您拥有一个 'correct' 的模型,因为它不会产生编码错误等,但它绝不保证它将在另一个不同的问题中表现良好。

请记住,原则上,预测 10-class 问题(如 MNIST)比预测 155-class 更容易 ] 一;第一种情况下的基线(即简单随机猜测)准确度约为 10%,而第二种情况仅为 ~ 0.65%。补充一下你的数据大小(与 MNIST 相比)也不大(它们是否也是 color 图片,即与单通道 MNIST 对比的 3 通道?),你的结果可能开始看起来不那么令人费解和惊讶了。

此外,事实证明 MNIST 是出了名的容易拟合(我一直在尝试自己构建 很好地拟合 MNIST 的模型,到目前为止没有取得太大成功) ,你很容易得出一个结论,这个结论现在已经成为社区的常识,即 MNIST 上的良好表现并不能说明模型架构的真正意义。