具有咖啡因的神经网络的低精度

时间:2018-01-27 05:57:38

标签: machine-learning neural-network 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时,损失会大大减少,准确度会提高!

哪一部分错了?

1 个答案:

答案 0 :(得分:0)

代码中不一定有问题。

你对MNIST获得这些好结果的事实说你确实有一个“正确”的模型,因为它不会产生编码错误等,但它绝不保证它会表现良好另一个不同的问题。

请记住,原则上,预测10级问题(如MNIST)比155级问题更容易 ;第一种情况下的基线(即简单随机猜测)精度约为10%,而第二种情况仅为约0.65%。再加上您的数据大小(与MNIST相当)也不大(它们是 color 图片,即3通道与单通道MNIST相比?),您的结果可能会开始那令人费解和令人惊讶。

另外,事实证明MNIST非常容易适应(我一直在努力构建那些非常适合MNIST的模型,到目前为止没有取得多大成功),并且您很容易达到结论现在已成为社区的共识,即MNIST的良好表现并未对模型架构起到太多作用。