現象:訓練loss一開始下降一部分,跌代到若干次(具體多少和你的learning rate大小有關,大就迭代小就發生,小就需要多幾次迭代)
日志如下(下面的日志來源於網絡,我自己的日志已經clear掉了,不過不影響):
INFO:tensorflow:global step 272: loss = 0.2479 (0.158 sec/step)
INFO:tensorflow:global step 273: loss = 0.3874 (0.159 sec/step)
INFO:tensorflow:global step 274: loss = 0.2599 (0.158 sec/step)
INFO:tensorflow:global step 275: loss = 27207767073038008320.0000 (0.155 sec/step)
INFO:tensorflow:global step 276: loss = 363770730445224804352.0000 (0.154 sec/step)
INFO:tensorflow:global step 277: loss = 2319587573063963639808.0000 (0.157 sec/step)
INFO:tensorflow:global step 278: loss = 9538479895582634672128.0000 (0.155 sec/step)
INFO:tensorflow:global step 279: loss = 35610680577759077466112.0000 (0.153 sec/step)
網上說是可能數據增強的原因,但是根據現象,為什么一開始是正常的呢。知道我我看一個網上的同學說,他發現是他的
label_map.pbtxt中是有5個類別,但是在pipline.config中number_class:4,導致出現不一致,后面該同學修改過來就可以了。
我的解決是,我在label_map.pbtxt中的id是1,name:cat,但是在生成tfrecord的時候是cats,這導致了不一致,使得訓練中獲取lable1出錯。
為什么現象是loss先降低后崩掉(梯度爆炸中比較特殊的一種吧,個人認為)這樣呢?
因為,一開始模型還處於非工作狀態,在first stage的時候,模型通過識別到目標使得loss下降,當模型訓練到一定程度,對目標識別越來越好,second
loss開始占主導或者second-stage輸入變得有規律,不再隨機,這時候,需要識別具體是什么目標的時候,tfrecord里面的label是cats,在label_map.pbtxt需要找到
對應的id時,這時候因為“label_map.pbtxt中的id是1,name:cat,但是在生成tfrecord的時候是cats”不一致,導致沒取到id,這時就開始亂套了。
所以,做數據要仔細呀