Странная схема проигрыша при использовании двух проигрышей в кафе

Я тренирую CNN в кафе и получаю следующую странную картину потерь:

I0425 16:38:58.305482 23335 solver.cpp:398]     Test net output #0: loss = nan (* 1 = nan loss)
I0425 16:38:58.305524 23335 solver.cpp:398]     Test net output #1: loss_intermediate = inf (* 1 = inf loss)
I0425 16:38:59.235857 23335 solver.cpp:219] Iteration 0 (-4.2039e-45 iter/s, 20.0094s/50 iters), loss = 18284.4
I0425 16:38:59.235926 23335 solver.cpp:238]     Train net output #0: loss = 18274.9 (* 1 = 18274.9 loss)
I0425 16:38:59.235942 23335 solver.cpp:238]     Train net output #1: loss_intermediate = 9.46859 (* 1 = 9.46859 loss)
I0425 16:38:59.235955 23335 sgd_solver.cpp:105] Iteration 0, lr = 1e-06
I0425 16:39:39.330327 23335 solver.cpp:219] Iteration 50 (1.24704 iter/s, 40.0948s/50 iters), loss = 121737
I0425 16:39:39.330410 23335 solver.cpp:238]     Train net output #0: loss = 569.695 (* 1 = 569.695 loss)
I0425 16:39:39.330425 23335 solver.cpp:238]     Train net output #1: loss_intermediate = 121168 (* 1 = 121168 loss)
I0425 16:39:39.330433 23335 sgd_solver.cpp:105] Iteration 50, lr = 1e-06
I0425 16:40:19.372197 23335 solver.cpp:219] Iteration 100 (1.24868 iter/s, 40.0421s/50 iters), loss = 34088.4
I0425 16:40:19.372268 23335 solver.cpp:238]     Train net output #0: loss = 369.577 (* 1 = 369.577 loss)
I0425 16:40:19.372283 23335 solver.cpp:238]     Train net output #1: loss_intermediate = 33718.8 (* 1 = 33718.8 loss)
I0425 16:40:19.372292 23335 sgd_solver.cpp:105] Iteration 100, lr = 1e-06
I0425 16:40:59.501541 23335 solver.cpp:219] Iteration 150 (1.24596 iter/s, 40.1297s/50 iters), loss = 21599.6
I0425 16:40:59.501606 23335 solver.cpp:238]     Train net output #0: loss = 478.262 (* 1 = 478.262 loss)
I0425 16:40:59.501621 23335 solver.cpp:238]     Train net output #1: loss_intermediate = 21121.3 (* 1 = 21121.3 loss)
...
I0425 17:09:01.895849 23335 solver.cpp:219] Iteration 2200 (1.24823 iter/s, 40.0568s/50 iters), loss = 581.874
I0425 17:09:01.895912 23335 solver.cpp:238]     Train net output #0: loss = 532.049 (* 1 = 532.049 loss)
I0425 17:09:01.895926 23335 solver.cpp:238]     Train net output #1: loss_intermediate = 49.8377 (* 1 = 49.8377 loss)
I0425 17:09:01.895936 23335 sgd_solver.cpp:105] Iteration 2200, lr = 1e-06

К вашему сведению: Моя сеть состоит в основном из двух этапов, поэтому у меня два проигрыша. Первую стадию можно рассматривать как грубую стадию, а вторую — как стадию повышения частоты дискретизации для грубой стадии.

Мой вопрос: это типичная модель потерь? Сначала значение loss высокое, а intermediate_loss низкое для первой итерации, а затем в следующих итерациях оно в основном меняется, так что loss составляет ниже, а intermediate_loss выше. В итоге сходится только intermediate_loss.


person Community    schedule 25.04.2017    source источник
comment
Используете ли вы слои BatchNorm?   -  person Shai    schedule 25.04.2017
comment
Да! Но я устанавливаю global_stats false при обучении и true при тестировании @Shai Может быть, мне следует сначала обучить первый этап сети, а затем установить для всех lr_param значение 0 первого этапа.   -  person    schedule 26.04.2017


Ответы (1)


"типичный" - не совсем применимый термин. Существует такое разнообразие моделей и топологий, что вы можете найти множество примеров странной прогрессии потерь.

В вашем случае промежуточный убыток вполне может начаться с низкого уровня, потому что он «еще не знает ничего лучше». По мере того, как последние уровни становятся достаточно обученными, чтобы давать надежную обратную связь промежуточным слоям, тогда он начинает достаточно учиться, чтобы совершать серьезные ошибки.

Окончательный расчет потерь находится в прямом контакте с земной истиной; он учится с первой итерации, поэтому имеет более понятную прогрессию от высоких потерь к низким.

person Prune    schedule 25.04.2017