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