zoukankan      html  css  js  c++  java
  • 【小白学PyTorch】21 Keras的API详解(下)池化、Normalization层

    文章来自微信公众号:【机器学习炼丹术】。作者WX:cyx645016617.
    参考目录:

    下篇的内容中,主要讲解这些内容:

    • 四个的池化层;
    • 两个Normalization层;

    1 池化层

    和卷积层相对应,每一种池化层都有1D,2D,3D三种类型,这里主要介绍2D处理图像的一个操作。1D和3D可以合理的类推。

    1.1 最大池化层

    tf.keras.layers.MaxPooling2D(
        pool_size=(2, 2), strides=None, padding="valid", data_format=None, **kwargs
    )
    

    这个strides在默认的情况下就是步长为2 下面看个例子:

    import tensorflow as tf
    x = tf.random.normal((4,28,28,3))
    y = tf.keras.layers.MaxPooling2D(
        pool_size=(2,2))
    print(y(x).shape)
    >>> (4, 14, 14, 3)
    

    如果你把strides改成1:

    import tensorflow as tf
    x = tf.random.normal((4,28,28,3))
    y = tf.keras.layers.MaxPooling2D(
        pool_size=(2,2),
        strides = 1)
    print(y(x).shape)
    >>> (4, 27, 27, 3)
    

    如果再把padding改成‘same’:

    import tensorflow as tf
    x = tf.random.normal((4,28,28,3))
    y = tf.keras.layers.MaxPooling2D(
        pool_size=(2,2),
        strides = 1,
        padding='same')
    print(y(x).shape)
    >>> (4, 28, 28, 3)
    

    这个padding默认是'valid',一般strides为2,padding是valid就行了。

    1.2 平均池化层

    和上面的最大池化层同理,这里就展示一个API就不再多说了。

    tf.keras.layers.AveragePooling2D(
        pool_size=(2, 2), strides=None, padding="valid", data_format=None, **kwargs
    )
    

    1.3 全局最大池化层

    tf.keras.layers.GlobalMaxPooling2D(data_format=None, **kwargs)
    

    这个其实相当于pool_size等于特征图尺寸的一个最大池化层。看一个例子:

    import tensorflow as tf
    x = tf.random.normal((4,28,28,3))
    y = tf.keras.layers.GlobalMaxPooling2D()
    print(y(x).shape)
    >>> (4, 3)
    

    可以看到,一个通道只会输出一个值,因为我们的输入特征图的尺寸是(28 imes 28),所以这里的全局最大池化层等价于pool_size=28的最大池化层。

    1.4 全局平均池化层

    与上面的全局最大池化层等价。

    tf.keras.layers.GlobalAveragePooling2D(data_format=None, **kwargs)
    

    2 Normalization

    Keras官方只提供了两种Normalization的方法,一个是BatchNormalization,一个是LayerNormalization。虽然没有提供InstanceNormalization和GroupNormalization的方法,我们可以通过修改BN层的参数来构建。

    2.1 BN

    tf.keras.layers.BatchNormalization(
        axis=-1,
        momentum=0.99,
        epsilon=0.001,
        center=True,
        scale=True,
        beta_initializer="zeros",
        gamma_initializer="ones",
        moving_mean_initializer="zeros",
        moving_variance_initializer="ones",
        beta_regularizer=None,
        gamma_regularizer=None,
        beta_constraint=None,
        gamma_constraint=None,
        renorm=False,
        renorm_clipping=None,
        renorm_momentum=0.99,
        fused=None,
        trainable=True,
        virtual_batch_size=None,
        adjustment=None,
        name=None,
        **kwargs
    )
    

    我们来详细讲解一下参数:

    • axis:整数。表示哪一个维度是通道数维度,默认是-1,表示是最后一个维度。如果之前设置了channels_first,那么需要设置axis=1.
    • momentum:当training过程中,Batch的均值方差会根据batch计算出来,在预测或者验证的时候,这个均值方差是采用training过程中计算出来的滑动均值和滑动方差的。具体的计算过程是:
    • epsilon:一个防止运算除法除以0的一个极小数,一般不做修改;
    • center:True的话,则会有一个可训练参数beta,也就是beta均值的这个offset;如果是False的话,这个BN层则退化成以0为均值,gamma为标准差的Normalization。默认是True,一般不做修改。
    • scale:与center类似,默认是True。如果是False的话,则不使用gamma参数,BN层退化成以beta为均值,1为标准差的Normalization层。
    • 其他都是初始化的方法和正则化的方法,一般不加以限制,使用的方法在上节课也已经讲解了,在此不加赘述。

    这里需要注意的一点是,keras的API中并没有像PyTorch的API中的这个参数group,这样的话,就无法衍生成GN和InstanceN层了,在之后的内容,会在Tensorflow_Addons库中介绍

    2.2 LN

    tf.keras.layers.LayerNormalization(
        axis=-1,
        epsilon=0.001,
        center=True,
        scale=True,
        beta_initializer="zeros",
        gamma_initializer="ones",
        beta_regularizer=None,
        gamma_regularizer=None,
        beta_constraint=None,
        gamma_constraint=None,
        trainable=True,
        name=None,
        **kwargs
    )
    

    参数和BN的参数基本一致。直接看一个例子:

    import tensorflow as tf
    import numpy as np
    x = tf.constant(np.arange(10).reshape(5,2)*10,
                    dtype=tf.float32)
    print(x)
    y = tf.keras.layers.LayerNormalization(axis=1)
    print(y(x))
    

    运行结果为:

    tf.Tensor(
    [[ 0. 10.]
     [20. 30.]
     [40. 50.]
     [60. 70.]
     [80. 90.]], shape=(5, 2), dtype=float32)
    tf.Tensor(
    [[-0.99998  0.99998]
     [-0.99998  0.99998]
     [-0.99998  0.99998]
     [-0.99998  0.99998]
     [-0.99998  0.99998]], shape=(5, 2), dtype=float32)
    

    我在之前的文章中已经介绍过了LN,BN,GN,IN这几个归一化层的详细原理,不了解的可以看本文最后的相关链接中找一找。

  • 相关阅读:
    HDU 1124 Factorial
    hdu 1690 Bus System
    hdu 1113 Word Amalgamation
    POJ 2482 Stars in Your Window
    hdu 1385 ZOJ 1456 Minimum Transport Cost(经典floyd)
    hdu 1907 John
    VMware 虚拟机 安装 UBuntu 9.10 命令模式转换成窗口模试
    #pragma CODE_SEG __NEAR_SEG NON_BANKED详解
    Ubuntu 下Hadoop 伪分布式 hadoop0.20.2.tar.gz 的安装
    文件拷贝代码以及疑问
  • 原文地址:https://www.cnblogs.com/PythonLearner/p/13820020.html
Copyright © 2011-2022 走看看