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

1. 初始化

默认情况下使用Glorot初始化

1.1 使用其他初始化

(1)lecun

kernel_initializer='lecun_normal'

(2)he初始化

kernel_initializer='he_normal'

2. 非饱和激活函数

2.1 LeakyRelu

keras.layers.LeakyRelu(alpha=0.2)

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)

2.2 PReLU

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

import tensorflow as tf
tf.keras.layers.PReLU()

同样的就可以使用PReLU

2.2.1 参数

tf.keras.layers.PReLU(
    alpha_initializer='zeros',
    alpha_regularizer=None,
    alpha_constraint=None,
    shared_axes=None,
    **kwargs
)

在这里插入图片描述

2.3 RRelu

2.4 SELU

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

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

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')

3. 批量归一化

keras.layers.BatchNormalization()

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. 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'])

4.1 报错

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

optimizer=tf.keras.optimizers.SGD(clipvalue=1.0)

或者是直接 from tensorflow import keras

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())

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

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

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

解冻之后可以降低学习率

5.2 小结

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

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

原代码
tf.keras.layers.PReLU()
报错
TypeError: 'PReLU' object is not iterable

6.优化器

6.1 动量优化

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

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

6.2 Nesterov 加速梯度

在使用优化器时nesterov=True

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

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
)

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

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

6.4 Adam 和 Nadam

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

使用示例

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值