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.种类

    1.Conv1D

    2.Conv2D

    3.SeparableConv2D

    4.Conv2DTranspose

    5.Conv3D

    6.Cropping1D

    7.Cropping2D

    8.Cropping3D

    9.UpSampling1D

    10.UpSampling2D

    11.UpSampling3D

    12.ZeroPadding1D

    13.ZeroPadding2D

    14.ZeroPadding3D

  3.默认配置 

    1.时域卷积【一维卷积】

      Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=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)

      该层将输入信号与卷积核按照单一的空域【时域】方向进行卷积。如果use_bias=True,则还会加上一个偏置项,若activation不为None,则输出为经过激活函数的输出。

      输入数据类型:形如(samples, steps, input_dim)的2D张量。

      输出数据类型:形如(samples, new_steps, nb_filter)的3D张量。因为有向量填充的原因,steps的值会发生变化。

  4.应用代码【以Conv2D为例】

 

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

  5.源码【以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

  6.参数解析

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

  

posted @ 2020-03-07 19:26  云山之巅  阅读(3093)  评论(0编辑  收藏  举报