2

~278,000 の画像を持つ 280 クラスの分類問題があります。モデル GoogleNet (caffe の bvlc_googlenet) に基づいて、quick_solver.txt を使用して微調整を行います。私のソルバーは次のとおりです。

test_iter: 1000
test_interval: 4000
test_initialization: false
display: 40
average_loss: 40
base_lr: 0.001
lr_policy: "poly"
power: 0.5
max_iter: 800000
momentum: 0.9
weight_decay: 0.0002
snapshot: 20000

トレーニング中はバッチ サイズ 32 を使用し、テスト バッチ 32 も使用します。名前を変更して、3 つの層 loss1/classifier loss2/classifier と loss3/classifier を最初から再学習しました。グローバル学習率を 0.001 に設定しました。つまり、ゼロからのトレーニングで使用した値の 10 分の 1 です。ただし、最後の 3 つのレイヤーは学習率 0.01 のままです。

最初の反復のログファイル:

I0515 08:44:41.838122  1279 solver.cpp:228] Iteration 40, loss = 9.72169
I0515 08:44:41.838163  1279 solver.cpp:244]     Train net output #0: loss1/loss1 = 5.7261 (* 0.3 = 1.71783 loss)
I0515 08:44:41.838170  1279 solver.cpp:244]     Train net output #1: loss2/loss1 = 5.65961 (* 0.3 = 1.69788 loss)
I0515 08:44:41.838173  1279 solver.cpp:244]     Train net output #2: loss3/loss3 = 5.46685 (* 1 = 5.46685 loss)
I0515 08:44:41.838179  1279 sgd_solver.cpp:106] Iteration 40, lr = 0.000999975

100,000 回目の反復まで、私のネットは 50% のトップ 1 精度と ~80% のトップ 5 精度を取得します。

I0515 13:45:59.789113  1279 solver.cpp:337] Iteration 100000, Testing net (#0)
I0515 13:46:53.914217  1279 solver.cpp:404]     Test net output #0: loss1/loss1 = 2.08631 (* 0.3 = 0.625893 loss)
I0515 13:46:53.914274  1279 solver.cpp:404]     Test net output #1: loss1/top-1 = 0.458375
I0515 13:46:53.914279  1279 solver.cpp:404]     Test net output #2: loss1/top-5 = 0.768781
I0515 13:46:53.914284  1279 solver.cpp:404]     Test net output #3: loss2/loss1 = 1.88489 (* 0.3 = 0.565468 loss)
I0515 13:46:53.914288  1279 solver.cpp:404]     Test net output #4: loss2/top-1 = 0.494906
I0515 13:46:53.914290  1279 solver.cpp:404]     Test net output #5: loss2/top-5 = 0.805906
I0515 13:46:53.914294  1279 solver.cpp:404]     Test net output #6: loss3/loss3 = 1.77118 (* 1 = 1.77118 loss)
I0515 13:46:53.914297  1279 solver.cpp:404]     Test net output #7: loss3/top-1 = 0.517719
I0515 13:46:53.914299  1279 solver.cpp:404]     Test net output #8: loss3/top-5 = 0.827125

119,00回目の反復では、すべてがまだ正常です

I0515 14:43:38.669674  1279 solver.cpp:228] Iteration 119000, loss = 2.70265
I0515 14:43:38.669777  1279 solver.cpp:244]     Train net output #0: loss1/loss1 = 2.41406 (* 0.3 = 0.724217 loss)
I0515 14:43:38.669783  1279 solver.cpp:244]     Train net output #1: loss2/loss1 = 2.38374 (* 0.3 = 0.715123 loss)
I0515 14:43:38.669787  1279 solver.cpp:244]     Train net output #2: loss3/loss3 = 1.92663 (* 1 = 1.92663 loss)
I0515 14:43:38.669798  1279 sgd_solver.cpp:106] Iteration 119000, lr = 0.000922632

その直後、損失は突然上昇します。つまり、最初の損失 (8 から 9) に等しくなります。

I0515 14:43:45.377710  1279 solver.cpp:228] Iteration 119040, loss = 8.3068
I0515 14:43:45.377751  1279 solver.cpp:244]     Train net output #0: loss1/loss1 = 5.77026 (* 0.3 = 1.73108 loss)
I0515 14:43:45.377758  1279 solver.cpp:244]     Train net output #1: loss2/loss1 = 5.76971 (* 0.3 = 1.73091 loss)
I0515 14:43:45.377763  1279 solver.cpp:244]     Train net output #2: loss3/loss3 = 5.70022 (* 1 = 5.70022 loss)
I0515 14:43:45.377768  1279 sgd_solver.cpp:106] Iteration 119040, lr = 0.000922605

そして、突然の変化が起こってから長い間、ネットはその損失を減らすことができません

I0515 16:51:10.485610  1279 solver.cpp:228] Iteration 161040, loss = 9.01994
I0515 16:51:10.485649  1279 solver.cpp:244]     Train net output #0: loss1/loss1 = 5.63485 (* 0.3 = 1.69046 loss)
I0515 16:51:10.485656  1279 solver.cpp:244]     Train net output #1: loss2/loss1 = 5.63484 (* 0.3 = 1.69045 loss)
I0515 16:51:10.485661  1279 solver.cpp:244]     Train net output #2: loss3/loss3 = 5.62972 (* 1 = 5.62972 loss)
I0515 16:51:10.485666  1279 sgd_solver.cpp:106] Iteration 161040, lr = 0.0008937

実験を 2 回再実行すると、反復 119040 番目で正確に繰り返されます。詳細については、LMDB データベースの作成時にデータ シャッフルを行いました。そして、このデータベースを使用して VGG-16 (ステップ学習率ポリシー、最大 80k 反復、ステップあたり 20k 反復) を問題なくトレーニングしました。VGG を使用すると、55% のトップ 1 精度が得られます。

私と同じような問題に遭遇した人はいますか?

4

0 に答える 0