我做的是一個識別驗證碼的深度學習模型,識別的圖片如下
驗證碼圖片識別4個數字,數字間是有順序的,設立標簽時設計了四個onehot向量鏈接起來,成了一個長度為40的向量,然后模型的輸入也是40維向量
用softmax_cross_entropy_with_logits(labels=,logits=)函數計算輸出與標簽的損失,發現損失值一直在增大,直到nan。
然后打印了輸出值,發現也是很大。覺得是梯度爆炸的原因,用梯度裁剪、限制權重值等方法一通結束之后發現根本沒什么改變。
最后只放入兩張圖片,發現模型擬合的仍然不夠好。這么大的網絡不能擬合好兩張圖片顯然是不對的。我將正則化、droupout、滑動平均全部注釋掉,將代碼化簡到最小,並且替換了之前的沒有問題的別的模型,扔存在這個問題。想到了應該處在最原始的圖片標簽與損失函數上,檢查了圖片標簽發現都能對應上,最后看損失函數發現softmax_cross_entropy_with_logits(labels=,logits=)損失函數算40維向量之間的損失的實際意義是計算40個分類中排名最靠前的4中可能,與分別計算4個10分類onehot值不同。總之是哪里出了問題,於是將標簽與輸出值都做了處理,分解成4個y=tf.reshape(y,[-1,4,10])。再用同樣的損失函數處理。loss值立馬下降。這里的問題我還沒有太想明白,只是初步分析了一下解決的方法。如果有大神知道其中的緣由希望給予指點。