1. 程式人生 > >Keras深度神經網路模型分層分析【輸入層、卷積層、池化層】

Keras深度神經網路模型分層分析【輸入層、卷積層、池化層】

一.輸入層

  1.用途

    構建深度神經網路輸入層,確定輸入資料的型別和樣式。

  2.應用程式碼

    input_data = Input(name='the_input', shape=(1600, 200, 1))

  3.原始碼

def Input(shape=None, batch_shape=None,
          name=None, dtype=None, sparse=False,
          tensor=None):

    if not batch_shape and tensor is None:
        assert shape is not None, ('Please provide to Input either a `shape`'
                                   ' or a `batch_shape` argument. Note that '
                                   '`shape` does not include the batch '
                                   'dimension.')
    if shape is not None and not batch_shape:
        batch_shape = (None,) + tuple(shape)
    if not dtype:
        dtype = K.floatx()
    input_layer = InputLayer(batch_input_shape=batch_shape,
                             name=name, dtype=dtype,
                             sparse=sparse,
                             input_tensor=tensor)
    # Return tensor including _keras_shape and _keras_history.
    # Note that in this case train_output and test_output are the same pointer.
    outputs = input_layer.inbound_nodes[0].output_tensors
    if len(outputs) == 1:
        return outputs[0]
    else:
        return outputs

  4.引數解析

    1.shape:一個形狀元組(整數),不包括批處理大小。 例如,shape =(32,)表示預期的輸入將是32維向量的批次。

    2.batch_shape:一個形狀元組(整數),包括批處理大小。 例如,“ batch_shape =(10,32)”表示預期的輸入將是10個32維向量的批次。

       “ batch_shape =(None,32)”表示任意數量的32維向量的批次。

    3.name:圖層的可選名稱字串。 在模型中應該是唯一的(不要重複使用同一名稱)。如果未提供,它將自動生成。

    4.dtype:輸入期望的資料型別,為字串,例如:`float32`,`float64`,`int32` ...

    5.sparse:一個布林值,指定要建立的佔位符是否稀疏。

    6.tensor:可選的現有張量以包裝到“ Input”層中。 如果設定,則該圖層將不會建立佔位符張量。

二.卷積層

  1.用途

    該層建立一個卷積核,該卷積核與該層輸入進行卷積以產生輸出張量。如果"use_bias"為True,則建立偏差向量並將其新增到輸出中。最後,如果"activation"不是None,它也將應用於輸出。當將此層作為模型的第一層時,要提供關鍵詞引數"input_shape"【整數元組,不包括樣本軸】,例如:當data_format="channels_last"時,128*128RGB三通道的圖片的input_shape=(128, 128, 3)。

  2.應用程式碼    

    Conv2D(64, kernel_size=(3, 3), strides=(1, 1), padding='same', input_shape=(28, 28, 1), activation='relu')

  3.原始碼【以Conv2D為例】

class Conv2D(_Conv):

    @interfaces.legacy_conv2d_support
    def __init__(self, filters,
                 kernel_size,
                 strides=(1, 1),
                 padding='valid',
                 data_format=None,
                 dilation_rate=(1, 1),
                 activation=None,
                 use_bias=True,
                 kernel_initializer='glorot_uniform',
                 bias_initializer='zeros',
                 kernel_regularizer=None,
                 bias_regularizer=None,
                 activity_regularizer=None,
                 kernel_constraint=None,
                 bias_constraint=None,
                 **kwargs):
        super(Conv2D, self).__init__(
            rank=2,
            filters=filters,
            kernel_size=kernel_size,
            strides=strides,
            padding=padding,
            data_format=data_format,
            dilation_rate=dilation_rate,
            activation=activation,
            use_bias=use_bias,
            kernel_initializer=kernel_initializer,
            bias_initializer=bias_initializer,
            kernel_regularizer=kernel_regularizer,
            bias_regularizer=bias_regularizer,
            activity_regularizer=activity_regularizer,
            kernel_constraint=kernel_constraint,
            bias_constraint=bias_constraint,
            **kwargs)
        self.input_spec = InputSpec(ndim=4)

    def get_config(self):
        config = super(Conv2D, self).get_config()
        config.pop('rank')
        return config

  4.引數解析

    1.filters:過濾器,整數,輸出空間的維數【即卷積中過濾器輸出的數量】。

    2.kernel_size:卷積核大小,1個整數或2個整數構成的元組或列表,指定2D卷積視窗的寬度和高度。可以只指定一個一個,表示所有尺寸指定相同的值。

    3.strides:步長,1個整數或2個整數構成的元組或列表,指定沿寬度和高度的卷積步幅長度。可以只指定一個一個,表示所有尺寸指定相同的值。指定步長!=1與指定擴張率【下面解釋】!=1不相容。

    4.padding:填充,包括"valid"和"same"。

    5.data_format:資料格式,一個字串,"channels_last"【預設】或"channels_first"之一。輸入中尺寸的順序。"channels_last"對應形狀為(批,高度,寬度,通道)的輸入樣式,而"channels_first"對應形狀為(批,通道,高度,寬度)的輸入樣式。它預設在Keras配置檔案中的~/.keras/keras.json中指定的image_data_format值。如果未指定,預設為"channels_last"。

    6.dilation_rate:一個整數或兩個整數構成的元組或列表,指定用於擴張卷積的擴張率。可以是單個整數,表示所有尺寸指定相同的值。目前,指定步長!=1與指定擴張率!=1不相容。

    7.activation:啟用函式,若未指定,則不使用任何啟用函式【即線性啟用:a(x) = x】。

    8.use_bias:布林值,圖層是否使用偏差向量。

    9.kernel_initializer:核心權重矩陣的初始化程式。

    10.bias_initializer:偏差向量的初始化程式。

    11.kernel_regularizer:正則化函式應用於核心權重矩陣。

    12.bias_regularizer:正則化函式應用於偏差向量。  

    13.activity_regularizer:正則化函式應用於圖層額輸出。

    14.kernel_constraint:約束函式應用於核心矩陣。

    15.bias_constaint:約束函式應用於偏差向量。

三.池化層

  1.用途

    所謂池化,存在兩種池化方式,分別是均值池化和最大池化。在指定視窗大小時,均值池化指取視窗資料的平均值來代替視窗資料的方式來實現資料縮放,視窗越大,縮放比例越大。最大池化的原理與均值池化類似,只是取視窗資料中的最大值來代替視窗資料,因此,相比較均值池化,最大池化的結果更加突出,也更加常用。

  2.種類

    1.最大池化

      a.MaxPooling1D

      b.MaxPooling2D 為空域訊號施加最大池化,應用於二維資料處理。例如:手寫數字識別。

      c.MaxPooling3D 

    2.均值池化

      a.AveragePooling1D

      b.AveragePooling2D

      c.AveragePooling3D

    3.全域性最大池化

        a.GlobalMaxPooling1D

      b.GlobalMaxPooling2D

    4.全域性均值池化

      a.GlobalAveragePooling1D

      b.GlobalAveragePooling2D

  3.應用程式碼

    MaxPooling1D(pool_size=2, strides=None, padding='valid')

    MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)

    MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None)

    AveragePooling1D(pool_size=2, strides=None, padding='valid')

    AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)

    AveragePooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None)

    GlobalMaxPooling1D()

    GlobalMaxPooling2D(dim_ordering='defalut')

    GlobalAveragePooling1D()

    GlobalAveragePooling2D(dim_ordering='default')

  4.原始碼【以MaxPooling2D為例】   

class MaxPooling2D(_Pooling2D):

    @interfaces.legacy_pooling2d_support
    def __init__(self, pool_size=(2, 2), strides=None, padding='valid',
                 data_format=None, **kwargs):
        super(MaxPooling2D, self).__init__(pool_size, strides, padding,
                                           data_format, **kwargs)

    def _pooling_function(self, inputs, pool_size, strides,
                          padding, data_format):
        output = K.pool2d(inputs, pool_size, strides,
                          padding, data_format,
                          pool_mode='max')
        return output

  5.引數分析【以MaxPooling2D為例】

    pool_size:整數或長度為2的整數元組,代表在兩個方向【豎直、水平】上的下采樣因子,如取(2, 2)將使圖片在兩個維度上均變為原長的一半【4個數據合成為1個】。為整數表示各個維度值相同且為該數字。

    strides:步長,整數或長度為2的整數元組或None。

    padding:填充,包括"valid"和"same"。

    data_format:資料格式,一個字串,"channels_last"【預設】或"channels_first"之一。輸入中尺寸的順序。"channels_last"對應形狀為(批,高度,寬度,通道)的輸入樣式,而"channels_first"對應形狀為(批,通道,高度,寬度)的輸入樣式。它預設在Keras配置檔案中的~/.keras/keras.json中指定的image_data_format值。如果未指定,預設為"channels_last"。

四.備註

  1.padding填充策略