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填充策略