2

私は 1 つを構築していますが、lenet の例で提供されているカスタム トレイン関数を 110 より大きいバッチ サイズで使用すると、精度が 1 (100%) より大きくなります。

バッチ サイズ 32 を使用すると、30% の精度が得られます。バッチ サイズが 64 の場合、正味の精度は 64 です。バッチ サイズが 128 の場合、精度は 1.2 です。

私の画像は 32x32 です。データセットのトレーニング: ニュートラルな顔の 56 枚の画像。驚きの顔画像60枚。テスト データセット: ニュートラルな顔の 15 枚の画像。驚きの顔画像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

では、私のコードの何が問題なのですか?

4

1 に答える 1

3

テスト コードでは、100 回の反復 ( ) を実行します。反復ごとに、正しいバッチ内の例の数としてfor test_it in range(100)計算します。次に、その数値を 1e4 で割ります。correct

モデルが非常に優れており、予測率がほぼ 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)
于 2015-11-17T17:58:00.560 に答える