1. 程式人生 > >【我的TensorFlow之路·4】關於CNN的一些細節問題

【我的TensorFlow之路·4】關於CNN的一些細節問題

       看CNN相關的東西也有一段時間了,但總是感覺深入不進去,這次又讀《面向機器智慧的TensorFlow實踐》這本書,補充了一些知識漏洞,以前不太注意的,或者直接拿來用的一些東西,現在有了更深入的瞭解。

1.步長

       設定步長是一種調整輸入張量維度的方法。降維可減少所需的運算量,並可避免建立一些完全重疊的感受域。strides引數用來控制步長,其格式與輸入向量相同,即(image_batch_size_stride,

image_height_stride,

image_width_stride,

image_channels_stride)

其中第一個和最後一個引數通常很少修改,主要控制特徵圖寬和高這兩維度的步長。

官方解釋:

2.邊界填充

       由padding引數控制的邊界填充有兩個可選值,分別是SAME和VALID,之前只知道SAME是全零填充,一直都是直接使用SAME,沒有去深究和VALID的區別。書中關於這兩個可選值的解釋為:

3.深入理解卷積核

       在攝影中,濾波器可以對圖片進行大幅度修改,例如紅色濾波器可以控制只有紅光透過(其他色光會被吸收)。而在CV中,濾波器可以突出自己感興趣的特徵,弱化自己不感興趣的特徵,以下是兩個例子:

       以上兩個為不同的卷積核輸出的特徵,,可以明顯看出,第一個卷積核對邊緣更感興趣,其實這就是一個專門針對邊緣檢測的卷積核;而第二個卷積核的作用是增加捲積核中心位置的灰度,降低卷積核邊緣位置的灰度,其實這是一個用於“銳化”的卷積核。

4.單層CNN

       CNN在面對複雜問題時,單層是遠遠不夠的,但是單層CNN也有它的用途,如邊緣檢測。在面對絕大多數任務時,還是需要和其他層混合使用。

5.卷積層

        TensorFlow實現的卷積並非真正的卷積運算(所以先在到底是什麼,我也還不知道),它採用的是一種可以針對不同型別的卷積進行加速的技術。tf.nn.conv2d是最常用的一種卷積,另外還有一些其他型別的卷積:

6.啟用層

       與其它層混合使用生成特徵圖,主要對結果進行平滑(微分),目標是為神經網路引入非線性。效能較為突出的啟用函式為tf.nn.relu(),另外還有tf.nn.sigmoid()、tf.nn.tanh()、tf.nn.dropout()。

7.池化層

       池化層可以較高效地降維,從而減少過擬合。常用池化方式為最大池化、平均池化,即tf.nn.max_pool()、tf.nn.avg_pool()。

8.載入影象的細節

9.影象格式

        TensorFlow中主要包含兩種影象格式,分別是tf.image.decode_jpeg和tf.image.decode_png。值得注意的是,JPEG格式不會儲存alpha通道資訊,即透明度,但png可以儲存。png採用無失真壓縮,儲存的是原始檔案,但其檔案體積要比JPEG大。

       TensorFlow有一種內建的檔案格式——TFRecord,它可以將二進位制資料和標籤資料存在同一個檔案內,在模型訓練前可以通過預處理將資料存為TFRecord格式,儲存的標籤格式為OneHotEncode。以下是一個使用該格式檔案的例子: