1. 程式人生 > >Tensorflow實戰學習(十四)【卷積層、啟用函式、池化層、歸一化層、高階層】

Tensorflow實戰學習(十四)【卷積層、啟用函式、池化層、歸一化層、高階層】

CNN神經網路架構至少包含一個卷積層 (tf.nn.conv2d)。單層CNN檢測邊緣。影象識別分類,使用不同層型別支援卷積層,減少過擬合,加速訓練過程,降低記憶體佔用率。

TensorFlow加速所有不同類弄卷積層卷積運算。tf.nn.depthwise_conv2d,一個卷積層輸出邊接到另一個卷積層輸入,建立遵循Inception架構網路 Rethinking the Inception Architecture for Computer Vision
https://arxiv.org/abs/1512.00567 。tf.nn.separable_conv2d,規模較大模型不犧牲準確率加速訓練,規模小模型快速收斂但準確率低。tf.nn.conv2d_transpos,卷積核用於新特徵圖,每部分填充卷積核相同值,卷積核遍歷新影象,重疊部分相加。斯坦福大學課程CS231n Winter 2016:Lecture 13。

啟用函式與其他層輸出生成特徵圖,對某些運算結果平滑(微分),為神經網路引入非線性(輸入輸出曲線關係),刻畫輸入複雜變化,訓練複雜模型。啟用函式主要因素,單調,輸出隨輸入增長,可用梯度下降法找區域性極值點;可微分,定義域內任意一點有導數,輸出可用梯度下降法。
tf.nn.relu,修正線性單元,斜坡函式。分段線性,輸入非負輸出相同,輸入為負輸出為0。不受“梯度消失”影響,取值範圍[0, +∞]。較大學習速率時,易受飽和神經元影響。損失資訊但效能突出。輸入秩1張量(向量),小於0置0,其餘分量不變。
tf.sigmoid,只接收浮點數,返回區間[0.0, 1.0]內的值。輸入值較大返回接近1.0,輸入值較小返回接近0.0。適用於真實輸出位於[0.0, 1.0]。輸入接近飽和或變化劇烈,輸出範圍縮減成為問題。輸入0,輸出0.5,sigmoid函式值域中間點。
tf.tanh,雙曲正切函式,值域[-1.0, 1.0],有輸出負值能力。值域中間點為0.0。網路下層期待輸入為負值或0.0,會有問題。
tf.nn.dropout,依據可配置概率輸出設0.0。適合少量隨機性有助於訓練。keep_prob引數指定輸出保持概率。每次執行,不同輸出。丟棄輸出設為0.0。

池化層減少過擬合,減小輸入尺寸,提高效能。輸入降取樣,為後續層保留重要資訊。池化層減小尺寸效率比tf.nn.conv2d高。
tf.nn.max_pool,跳躍遍歷張量,卷積核覆蓋元素最大數值作卷積結果。適合輸入資料灰度與影象重要性相關。輸入為前一層輸出,非直接影象。跨度strides使用image_height、image_width遍歷輸入。只保留輸入張量最大元素。最大池化(max-pooling),利用接受域(卷積核)完成。2X2接受域,單個通路最小數量降取樣。1X1接受域,輸出輸入相同。
tf.nn.avg_pool,跳躍遍歷張量,卷積核覆蓋各深度值取平均。適合卷積核重要,實現值縮減。如輸入張量寬度高度大,深度小。

tf.nn.relu是無界函式,歸一化識別高頻特徵。tf.nn.local_response_normalization(tf.nn.lrn),區域性響應歸一化,給定向量,每個分量被depth_radius覆蓋輸入加權和除。輸入保持在可接受範圍。考慮每個值重要性。歸一化輸出調整到區間[-1.0, 1.0]。

高階層減少程式碼冗餘,遵循最佳實踐。
tf.contrib.layers.convolution2d。權值初始化、偏置初始化、可訓練變數輸出、偏置相加、新增啟用函式。卷積核,可訓練變數。權值初始化用於卷積核首次執行值填充(tf.truncated_normal)。簡單元組形式表示卷積核高度和寬度。輸入影象,tf.image.convert_image_dtype,調整各分量表示顏色值。TensorFlow要求浮點型描述影象顏色,分量在[0, 1]。
tf.contrib.layers.fully_connected。全連線層,每個輸入輸出存在連線。CNN最後一層常是全連線層。TensorFlow全連線層格式,tf.matmul(features,weight)+bias。輸入張量與輸出層每個神經元連線。

原始輸入需要傳遞給輸入層。目標識別與分類輸入層tf.nn.conv2d。

    import tensorflow as tf
    features = tf.range(-2, 3)
    print features
    sess = tf.Session()
    print sess.run([features, tf.nn.relu(features)])
    features2 = tf.to_float(tf.range(-1, 3))
    print features2
    print sess.run([features2, tf.sigmoid(features2)])
    print sess.run([features2, tf.tanh(features2)])
    features3 = tf.constant([-0.1, 0.0, 0.1, 0.2])
    print features3
    print sess.run([features3, tf.nn.dropout(features3, keep_prob=0.5)])
    batch_size = 1
    input_height = 3
    input_width = 3
    input_channels = 1
    layer_input = tf.constant([
            [
                [[1.0], [0.2], [1.5]],
                [[0.1], [1.2], [1.4]],
                [[1.1], [0.4], [0.4]]
            ]
        ])
    print layer_input
    kernel = [batch_size, input_height, input_width, input_channels]
    print kernel
    max_pool = tf.nn.max_pool(layer_input, kernel, [1, 1, 1, 1], "VALID")
    print max_pool
    print sess.run(max_pool)
    layer_input2 = tf.constant([
            [
                [[1.0], [1.0], [1.0]],
                [[1.0], [0.5], [0.0]],
                [[0.0], [0.0], [0.0]]
            ]
        ])
    print layer_input2
    avg_pool = tf.nn.avg_pool(layer_input2, kernel, [1, 1, 1, 1], "VALID")
    print avg_pool
    print sess.run(avg_pool)
    layer_input3 = tf.constant([
            [
                [[1.], [2.], [3.]]
            ]
        ])
    print layer_input3
    lrn = tf.nn.local_response_normalization(layer_input3)
    print lrn
    print sess.run([layer_input3, lrn])
    image_input = tf.constant([
            [
                [[0., 0., 0.], [255., 255., 255.], [254., 0., 0.]],
                [[0., 191., 0.], [3., 108., 233.], [0., 191., 0.]],
                [[254., 0., 0.], [255., 255., 255.], [0., 0., 0.]]
            ]
        ])
    print image_input
    conv2d = tf.contrib.layers.convolution2d(
        image_input,
        num_outputs=4,
        kernel_size=(1,1),
        activation_fn=tf.nn.relu,
        stride=(1,1),
        trainable=True)
    print conv2d
    sess.run(tf.global_variables_initializer())
    print sess.run(conv2d)
    features4 = tf.constant([
            [[1.2], [3.4]]
        ])
    print features4
    fc = tf.contrib.layers.fully_connected(features4, num_outputs=2)
    print fc
    sess.run(tf.global_variables_initializer())
    print sess.run(fc)

參考資料:
《面向機器智慧的TensorFlow實踐》