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 1231 最大连续子序列
    数据加载初始化问题
    分页查询
    PHP-引入文件(include)后,页面错位,不居中解决办法
    数据库中的事务和锁(乐观、悲观锁,共享、排他锁,死锁)
    java操作excel 工具类
    微信公众号处理
    java实用资料
    【转】字符流和字节流的区别,使用场景,相关类
    基于redis分布式锁实现“秒杀”
  • 原文地址:https://www.cnblogs.com/PythonLearner/p/13820020.html
Copyright © 2011-2022 走看看