這周又在暴肝作業(yè)蚂会。寫(xiě)完了科技史論文转捕,字?jǐn)?shù)肯定夠了作岖,也寫(xiě)了自己的觀點(diǎn),但是不能保證觀點(diǎn)的深入五芝。在論文的過(guò)程中痘儡,發(fā)現(xiàn)自己已經(jīng)很久沒(méi)有寫(xiě)過(guò)這種流暢的長(zhǎng)篇文章了,而且論文越寫(xiě)越像實(shí)驗(yàn)報(bào)告枢步。
為了寫(xiě)數(shù)字圖像處理大作業(yè)沉删,速成了Tensorflow。其實(shí)就是拿了隊(duì)友的Tensorflow模板然后把自己的網(wǎng)絡(luò)和數(shù)據(jù)集塞進(jìn)去而已醉途。昨天下午終于把編譯錯(cuò)誤調(diào)完并跑了起來(lái)矾瑰,但是網(wǎng)絡(luò)一直不收斂,調(diào)到凌晨快一點(diǎn)無(wú)果结蟋,今天早上起來(lái)又調(diào)了一兩個(gè)小時(shí)脯倚,居然就調(diào)出來(lái)了渔彰。
為了防止以后繼續(xù)跳坑嵌屎,做一個(gè)debug總結(jié)推正。作業(yè)是Few-shot Learning。
網(wǎng)絡(luò)不收斂宝惰,最初考慮的是超參有問(wèn)題植榕,而且本身這個(gè)問(wèn)題就很容易過(guò)擬合。于是前前后后調(diào)了若干輪learning rate尼夺,發(fā)現(xiàn)偶爾碰巧可以收斂尊残,但大多數(shù)情況下不能收斂。
然后開(kāi)始考慮是不是這個(gè)模型根本無(wú)法用于此問(wèn)題中淤堵。驗(yàn)證方法是每次都喂同一個(gè)episode寝衫,看一下會(huì)不會(huì)收斂。于是我把所有的random sample部分全部去掉拐邪,重新跑網(wǎng)絡(luò)慰毅,發(fā)現(xiàn)還是不能收斂。
然后開(kāi)始考慮把中間步驟輸出扎阶。Tensorflow對(duì)輸出中間過(guò)程非常不友好汹胃,只能開(kāi)始學(xué)習(xí)如何使用Tensorboard。最后可視化了各層的weight和bias东臀,以及中間的輸出着饥,發(fā)現(xiàn)直方圖壓根沒(méi)有隨epoch發(fā)生變化。
然后開(kāi)始考慮是不是梯度消失惰赋。把輸入數(shù)據(jù)輸出了一下宰掉,發(fā)現(xiàn)過(guò)于稀疏,思考是不是因?yàn)閎p時(shí)由于大量的x是0導(dǎo)致梯度無(wú)法更新赁濒。為了解決稀疏問(wèn)題贵扰,我用PCA把輸入從4096維降到了100維,無(wú)果流部。
然后開(kāi)始懷疑是不是把loss寫(xiě)錯(cuò)了戚绕,隨后我把loss的計(jì)算過(guò)程中的每個(gè)cluster center輸出了一下,發(fā)現(xiàn)所有種類(lèi)的cluster center的輸出幾乎都是1e-7的量級(jí)枝冀。
然后開(kāi)始懷疑是不是因?yàn)閎atch_norm之后數(shù)太小舞丛,導(dǎo)致cluster center幾乎都是原點(diǎn)。我把所有的bn層全都刪掉后果漾,cluster center的值確實(shí)變大了球切,結(jié)果驚訝的發(fā)現(xiàn)所有類(lèi)別的cluster center完全一樣。
為了搞清楚所有類(lèi)別的cluster center完全一樣這個(gè)問(wèn)題绒障,我把輸入數(shù)據(jù)中每個(gè)類(lèi)別的所有維的和輸出了一下吨凑,發(fā)現(xiàn)真的完全一樣,這時(shí)候才意識(shí)到可能dataset寫(xiě)錯(cuò)了。最后發(fā)現(xiàn)是因?yàn)橐粋€(gè)造數(shù)據(jù)集的時(shí)候把數(shù)組下標(biāo)寫(xiě)錯(cuò)了鸵钝。
總結(jié)這個(gè)過(guò)程:
- 把所有的random sample去掉更容易看出問(wèn)題糙臼。
- 相比nn部分,數(shù)據(jù)預(yù)處理更可能有bug恩商。
- 多輸出一些中間過(guò)程变逃。
- 要相信bn層的作用。
- Tensorboard真好用怠堪。