• TensorFlow学习(3)初始化&非饱和激活函数&批量归一化&梯度剪裁&迁移学习&优化器


    1. 初始化

    默认情况下使用Glorot初始化

    1.1 使用其他初始化

    (1)lecun

    kernel_initializer='lecun_normal'
    
    • 1

    (2)he初始化

    kernel_initializer='he_normal'
    
    • 1

    2. 非饱和激活函数

    2.1 LeakyRelu

    keras.layers.LeakyRelu(alpha=0.2)
    
    • 1

    alpha为x<0时的斜率

    2.1.1报错

    AttributeError: module ‘keras.api._v2.keras.layers’ has no attribute ‘LeakyRelu’
    import tensorflow as tf
    tf.keras.layers.LeakyReLU(alpha=0.2)
    
    • 1
    • 2

    2.2 PReLU

    将α作为了需要学习的参数,该激活函数为PReLU

    import tensorflow as tf
    tf.keras.layers.PReLU()
    
    • 1
    • 2

    同样的就可以使用PReLU

    2.2.1 参数

    tf.keras.layers.PReLU(
        alpha_initializer='zeros',
        alpha_regularizer=None,
        alpha_constraint=None,
        shared_axes=None,
        **kwargs
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2.3 RRelu

    2.4 SELU

    在创建层的时候设置activation='selu'

    keras.layers.Dense(300,activation='selu',kernel_initializer='lecun_normal')
    
    
    • 1
    • 2

    2.4.1 自归一化的条件

    1. 输入特征必须是标注化的
    2. 每一个隐藏层的权重必须使用LeCun正态初始化,即必须设置kernel_initializer='lecun_normal'
    3. 网络的架构必须是顺序的
    4. 本论文仅在都是密集层的时候能保证自归一化

    2.5 ELU

    keras.layers.Dense(300,activation='elu',kernel_initializer='he_normal')
    
    • 1

    3. 批量归一化

    keras.layers.BatchNormalization()
    
    • 1

    3.1 参数

    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,
        **kwargs
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. axis:需要被归一化的轴
    2. momentum:使用融合公式,代表倾向于新值的量

    4. 梯度剪裁

    使用梯度剪裁就需要对SGD进行设置,因此不能像之前一样

    之前:
    # model.compile(loss="sparse_categorical_crossentropy",optimizer='sgd',metrics=['accuracy'])
    
    使用梯度剪裁(还是会报错):
    optimizer=keras.optimizer.SGD(clipvalue=1.0)
    model.compile(loss="mse",optimizer=optimizer,metrics=['accuracy'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.1 报错

    AttributeError: module ‘keras.api._v2.keras’ has no attribute ‘optimizer’

    optimizer=tf.keras.optimizers.SGD(clipvalue=1.0)
    
    或者是直接 from tensorflow import keras
    
    • 1
    • 2
    • 3

    4.2 梯度剪裁的参数

    1. clipvalue
      剪裁到限定范围内,可能会改变梯度向量的方向
    2. clipnorm(推荐!!!)
      可以保留方向

    5.迁移学习

    不要直接在原模型上修改,会影响原模型的权重,使用clone_model()对模型进行克隆

    5.1 克隆模型

    使用clone_model克隆模型(但是不会克隆权重)和get_weights复制权重

    model_clone=keras.models.clone_model(model)
    model_clone.set_weights(model.get_weights())
    
    • 1
    • 2

    新的输出层是随机初始化的,可能会产生较大的错误,因此存在较大的错误梯度,这颗可能会破坏重用的权重,一种方法是在前几个轮次冻结重用的层

    使用trainable控制训练,冻结训练如下:

    for layer in model_clone.layers[-1]:
        layer.trainable=False
    
    • 1
    • 2

    解冻之后可以降低学习率

    5.2 小结

    迁移学习在小型密集神经网络中不能很好的工作,最适合使用深度卷积神经网络

    5.3 报错:TypeError: ‘PReLU’ object is not iterable

    原代码
    tf.keras.layers.PReLU()
    报错
    TypeError: 'PReLU' object is not iterable
    
    • 1
    • 2
    • 3
    • 4

    6.优化器

    6.1 动量优化

    optimizer=keras.optimizers.SGD(lr=0.001,momentum=0.9)
    
    • 1

    动量为0.9通常在实验中效果很好

    6.2 Nesterov 加速梯度

    在使用优化器时nesterov=True

    optimizer=keras.optimizers.SGD(lr=0.001,momentum=0.9,nesterov=True)
    
    
    • 1
    • 2

    6.3 RMSProp

    RMSProp完整的参数:

    tf.keras.optimizers.RMSprop(
        learning_rate=0.001,
        rho=0.9,
        momentum=0.0,
        epsilon=1e-07,
        centered=False,
        name='RMSprop',
        **kwargs
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    使用示例:

    optimizer=keras.optimizers.RMSprop(lr=0.001,rho=0.9)
    
    • 1

    6.4 Adam 和 Nadam

    在TensorFlow中提供的Adam及其变体主要包括:
    在这里插入图片描述

    使用示例

    optimizer=keras.optimizers.Adam (lr=0.001,beta_1=0.9,beta_2=0.999)
    
    • 1

    重点关注beta_1,beta_2两个参数
    在这里插入图片描述

    beta_1通常被初始化为0.9,beta_2通常被初始化为0.999

  • 相关阅读:
    同花顺后端工程师一面面试经验
    创建文件练习
    分享如何筛选延误三天以上物流件
    【探索Linux】—— 强大的命令行工具 P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)
    ZYNQ LWIP实验
    双网关多发选收配置实验案例(5G CPE场景)
    Linux工具(二)
    PDF公式转Latex
    计算机算法设计与分析:随机化算法
    Allwinner T3 汽车级处理器为工业级 SoM 提供动力
  • 原文地址:https://blog.csdn.net/weixin_50862344/article/details/126872160