Deeplearning.ai 第4門課程<卷積神經(jīng)網(wǎng)絡(luò)>, 終于開始講解"現(xiàn)代"的深度神經(jīng)網(wǎng)絡(luò)了. 第二周也迅速開始使用Keras進(jìn)行神經(jīng)網(wǎng)絡(luò)的編寫.
雖然Keras已經(jīng)抽象程度很高了, 只需要設(shè)定基本的參數(shù), 就可以建立網(wǎng)絡(luò)層, 不至于在實(shí)現(xiàn)細(xì)節(jié)中迷失, 但是仍然會(huì)有些小坑容易踩.
下面是一些經(jīng)驗(yàn):
務(wù)必小心各種默認(rèn)值.
第一次用函數(shù)之前, 一定要先看文檔說明, 如果自己的要求明確, 比如是否使用激活函數(shù), pedding的方法等等, 就在函數(shù)調(diào)用時(shí)把這些要求都寫出來, 哪怕已經(jīng)有默認(rèn)值規(guī)定.
比如:
- tensorflow中, 設(shè)定好卷積層之后最后幾層往往還是全連階層, 設(shè)定全連階層的函數(shù)tf.contrib.layers.fully_connected有個(gè)默認(rèn)激活函數(shù)是ReLU, 如果你根本不想要激活函數(shù), 或者后續(xù)還要設(shè)定其他的激活函數(shù), 那么最好把a(bǔ)ctivation_fn=None
- keras中CONV2D默認(rèn)padding是valid, 我簡(jiǎn)直可以預(yù)見到自己日后一定會(huì)踩此坑. 而且不止一次.
維度一致
主路徑和捷徑的結(jié)果要相加, 必須維度一致. 如果主路徑的filters分別是F1, F2, F3, 捷徑的filter就應(yīng)當(dāng)是F3. 應(yīng)當(dāng)與最后一個(gè)filter#相同.
如果主路徑中有padding=valid, 捷徑中也需要相應(yīng)縮小.
復(fù)習(xí)一下維度的變化, 一個(gè)(N, N)的圖像, 經(jīng)過二維卷積, 如果卷積的大小是(f,f), padding是(p,p), strip是(s, s), 那么卷積以后的尺寸變成了
floor( (N+2p-f)/s+1 )
作用函數(shù)一致
首先ResNet中兩個(gè)卷積層的輸出結(jié)果不能簡(jiǎn)單的使用+, 而應(yīng)當(dāng)使用Add( )函數(shù).
Keras函數(shù)的返回值仍然是函數(shù), 因此Add函數(shù), 不能寫成Add([X,X_shortcut]), 而要寫成Add( )([X,X_s]).
在分路徑時(shí), 不同路徑上在把函數(shù)作用到變量時(shí), 要注意統(tǒng)一
- 主路徑中一直是X=CONV2d(...)(X),
- 捷徑中一直是X_shortcut=CONV2d(...)(X_shortcut), 不要在隨手復(fù)制粘貼時(shí)搞成了X_shortcut=CONV2d(...)(X)
這種bug有時(shí)候停難找的, 特別是后端用tensorflow的時(shí)候, 感覺用tensforflow比較難debug, 因?yàn)槭窍冉㈧o態(tài)的計(jì)算圖, 最后才喂給數(shù)據(jù), 以前編程時(shí)插入斷點(diǎn)跟蹤數(shù)據(jù)等debug的經(jīng)驗(yàn)就很難用上. @ailurus1991 提到了tensorflow專用的debug工具https://www.tensorflow.org/programmers_guide/debugger 還不知道是否好用.