【问题标题】:Caffe : train network accuracy = 1 constant ! Accuracy issueCaffe:训练网络准确率 = 1 常数!精度问题
【发布时间】:2016-05-29 03:45:22
【问题描述】:

现在,我是具有 2 类数据的训练网络……但在第一次迭代后准确度是恒定的 1!

输入数据是灰度图像。创建 HDF5Data 时,两个类图像都是随机选择的。

为什么会这样?哪里错了或者哪里错了!

network.prototxt:

name: "brainMRI"
layer {
  name: "data"
  type: "HDF5Data"
  top: "data"
  top: "label"
  include: {
    phase: TRAIN
  }
  hdf5_data_param {
    source: "/home/shivangpatel/caffe/brainMRI1/train_file_location.txt"
    batch_size: 10
  }
}
layer {
  name: "data"
  type: "HDF5Data"
  top: "data"
  top: "label"
  include: {
    phase: TEST
  }
  hdf5_data_param {
    source: "/home/shivangpatel/caffe/brainMRI1/test_file_location.txt"
    batch_size: 10
  }
}

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "ip1"
  type: "InnerProduct"
  bottom: "pool2"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 500
    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: 2
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "softmax"
  type: "Softmax"
  bottom: "ip2"
  top: "smip2"
}

layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "smip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}

输出:

I0217 17:41:07.912580  2913 net.cpp:270] This network produces output loss
I0217 17:41:07.912607  2913 net.cpp:283] Network initialization done.
I0217 17:41:07.912739  2913 solver.cpp:60] Solver scaffolding done.
I0217 17:41:07.912789  2913 caffe.cpp:212] Starting Optimization
I0217 17:41:07.912813  2913 solver.cpp:288] Solving brainMRI
I0217 17:41:07.912832  2913 solver.cpp:289] Learning Rate Policy: inv
I0217 17:41:07.920737  2913 solver.cpp:341] Iteration 0, Testing net (#0)
I0217 17:41:08.235076  2913 solver.cpp:409]     Test net output #0: accuracy = 0.98
I0217 17:41:08.235194  2913 solver.cpp:409]     Test net output #1: loss = 0.0560832 (* 1 = 0.0560832 loss)
I0217 17:41:35.831647  2913 solver.cpp:341] Iteration 100, Testing net (#0)
I0217 17:41:36.140849  2913 solver.cpp:409]     Test net output #0: accuracy = 1
I0217 17:41:36.140949  2913 solver.cpp:409]     Test net output #1: loss = 0.00757247 (* 1 = 0.00757247 loss)
I0217 17:42:05.465395  2913 solver.cpp:341] Iteration 200, Testing net (#0)
I0217 17:42:05.775877  2913 solver.cpp:409]     Test net output #0: accuracy = 1
I0217 17:42:05.776000  2913 solver.cpp:409]     Test net output #1: loss = 0.0144996 (* 1 = 0.0144996 loss)
.............
.............

【问题讨论】:

  • 你的测试集大小是多少?
  • h5ls test_AD.hdf5 data Dataset {3686, 1, 45, 64} label Dataset {3686, 1, 1, 1} h5ls test_NC.hdf5 data Dataset {7334, 1, 45, 64} label Dataset {7334, 1, 1, 1} h5ls train_AD.hdf5 data Dataset {14746, 1, 45, 64} label Dataset {14746, 1, 1, 1} h5ls train_NC.hdf5 data Dataset {29338, 1, 45, 64} label Dataset {29338, 1, 1, 1}
  • 您的日志仅打印测试迭代,您是否在进行任何培训?您在每个测试间隔运行多少次测试迭代?
  • test_iter: 5 test_interval: 100 base_lr: 0.001 momentum: 0.9 weight_decay: 0.0005 lr_policy: "inv" gamma: 0.0001 power: 0.75 # The maximum number of iterations max_iter: 10000 # snapshot intermediate results snapshot: 1000 snapshot_prefix: "/home/shivangpatel/caffe/brainMRI1/" # solver mode: CPU or GPU solver_mode: CPU
  • 有关test_intervalbatch_size 的更多信息,请参见this answer

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


【解决方案1】:

总结一些来自cmets的信息:
- 您以test_interval:100 迭代的间隔运行测试。
- 每个测试间隔超过 test_iter:5 * batch_size:10 = 50 个样本。
- 您的训练集和测试集似乎非常精简:所有负样本 (label=0) 在所有正样本之前分组在一起。


考虑一下您的 SGD 迭代求解器,您在训练期间为它提供了一批 batch_size:10。您的训练集在任何正样本之前有 14,746 个负样本(即 1474 个批次)。因此,对于前 1474 次迭代,您的求解器仅“看到”负面示例而没有正面示例。
您希望这个求解器会学到什么?

问题

你的求解器只看到负例,因此知道无论输入是什么,它都应该输出“0”。您的测试集也以相同的方式排序,因此在每个 test_interval 只测试 50 个样本,您只测试测试集中的负样本,结果完美准确率为 1。
但正如您所指出的,您的网络实际上什么也没学到。

解决方案

我想您现在已经猜到解决方案应该是什么了。您需要打乱您的训练集,并在您的整个测试集上测试您的网络。

【讨论】:

  • 好的....我会的。我还有另外 2 个这样的课程......我将混合训练样本并再次训练。结果我会发布...
  • 没有变化!结果相同...我还根据您的建议对求解器和网络 prototxt 进行了更改。 HDF5 创建代码...和其他文件 :-->> github.com/shivangpatel/caffe.git
  • 我认为,问题是灰度图像...关于 MRI 大脑...任何想法,如何使它对 caffe 中的输入有用
  • 我发现我的错误...您的建议很有帮助...非常感谢。
  • @DCurro : 问题是我们的输入数据...确保所有数据都正确洗牌。!检查您的输入数据......并正确混合。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2017-07-19
  • 2017-09-07
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 2017-10-05
相关资源
最近更新 更多