2

我正在构建一个,但是当我使用批量大于110的lenet example上提供的定制列车功能时,我的准确度会大于1(100%)。Caffe精度大于100%

如果我使用批量大小32,我会得到30%的准确度。批量大小等于64我的净精度是64.而批量大小等于128,精度为1.2。

我的图像是32x32。火车数据集:56张中性面孔图像。 60惊讶的面孔的图像。测试数据集:15张中性脸图像。 Surprise面临15张图片。

这是我的代码:

def train(solver): 

niter = 200 
test_interval = 25 

train_loss = zeros(niter) 
test_acc = zeros(int(np.ceil(niter/test_interval))) 
output = zeros((niter, 32, 2)) 

for it in range(niter): 
    solver.step(1) 
    train_loss[it] = solver.net.blobs['loss'].data 
    solver.test_nets[0].forward(start='conv1') 
    output[it] = solver.test_nets[0].blobs['ip2'].data[:32] 
    if it % test_interval == 0: 
     print 'Iteration', it, 'testing...' 

     correct = 0 

     for test_it in range(100): 
      solver.test_nets[0].forward() 
      correct += sum(solver.test_nets[0].blobs['ip2'].data.argmax(1) == solver.test_nets[0].blobs['label'].data) 

     test_acc[it // test_interval] = correct/1e4 

那么,什么是错我的代码?

回答

3

在您的测试代码在运行100次迭代(for test_it in range(100)),在每次迭代计算你为correct在一个一批是正确的实例数。然后你将这个数字除以1e4。

让我们假设你的模型非常好,几乎有100%的预测率。然后在每次100次迭代时批量大小为32,您将添加32到correct,产生3200.然后,将它除以1e4,最后以0.32结束,这与您所看到的几乎一致(您的数量稍微更少,因为有时您模型没有预测到目标)。

要解决它,你可以代替

test_acc[it // test_interval] = correct/1e4 

test_acc[it // test_interval] = correct/(100.0 * batch_size) 
+0

谢谢!你救了我的命= D – Pasdf

+0

这真的救了我的一天!我想知道他们为什么在LeNet示例中使用'correct/1e4'。你的代码更好,可以接受... – Cypher