Caffe:如何使用已经训练过的模型一次检查多个数据集的准确度?

时间:2016-07-02 06:48:03

标签: machine-learning neural-network deep-learning caffe

在Caffe框架中使用2个类别的10k图像训练LeNet模型后,我得到了包含权重和偏差的模型lenet_iter_4000.caffemodel。我想一次检查5k新测试图像的准确性(这不是训练时测试图像的一部分)。我为所有这些5k图像创建了lmdb文件。我知道如何使用以下方法测试图像。

./build/tools/caffe test --model=examples/mnist/lenet_train_test.prototxt --weights=examples/mnist/lenet_iter_4000.caffemodel

但我无法一次获得准确性,如果我们将test_interval 3000放入训练时我们将获得准确性,我们将在3000次迭代后获得所有测试图像的准确性。如果我想在训练后一次测试准确性,我必须在原型文件中进行更改。 我的问题是:如何在训练后使用经过训练的模型获得多个数据集的准确度?

2 个答案:

答案 0 :(得分:4)

一个快速解决方案是在培训时获得多个数据集的准确性。您可以通过修改solver.prototxt和net.prototxt来实现这一目的,如下所示,更具体地说,是在solver.prototxt中使用多个“test_state”,使用不同的“include:{stage:”xxx“}” net.prototxt用于测试多个数据集:

solver.prototxt:

net: "lenet_train_test.prototxt"
#testing stage for your orininal test images
test_state: { stage: "original test" }
#testing stage for your new test images
test_state: { stage: "new 5k test" }
#iterations for original testing
test_iter: xxx
#iterations for your new 5k testing
test_iter: xxx
#Those 2 testings use the same test_interval
test_interval: 500

对应的net.prototxt:

name: "LeNet"
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist_train_lmdb"
    batch_size: 32
    backend: LMDB
    shuffle: true
  }
}
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
    stage: "original test"
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist_test_lmdb"
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
    stage: "new 5k test"
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "path/to/your/5k_images_test_lmdb"
    batch_size: 100
    backend: LMDB
  }
}
.
.
.
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"
}

使用它们就像一种微调方式:

./build/tools/caffe train --solver=examples/mnist/solver.prototxt --weights=examples/mnist/lenet_iter_4000.caffemodel

在迭代0处,求解器将测试多个数据集,您将获得它们的多个精度,然后可以停止求解器。

答案 1 :(得分:0)

只需使用caffe的测试工具,请检查the interface examples

我在这里有点晚了,但是那些想知道如何仅将测试模型用于测试目的的人可以使用caffe的测试工具。如果您训练了模型,并计划在之后使用它,那么您应该在每次迭代时保存权重。让我们将最终保存的权重命名为model_iter_xxxx.caffemodel。

  1. 将模型复制到model_test.prototxt(例如)

  2. 在测试阶段添加要考虑的层,即用于测试数据和精度层的输入层。

  3. 运行:caffe test -model path/to/model_test.prototxt -weights path/to/model_iter_xxxx.caffemodel -iterations 100