現象:訓練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,這時就開始亂套了。
因此,作數據要仔細呀label_map.pbtxttfrecordcatslabel_map.pbtxt
label_map.pbtxtlabel_map.pbtxt
中的id是1,name:cat,可是在生成tfrecord的時候是catslabel_map.pbtxt