入坑tensorflow2.0之为工程添加指数衰减学习率、正则化、优化器配置

1.指数衰减学习率

from tensorflow_core.python.keras.callbacks import LearningRateScheduler
import tensorflow_core as tfc

num_epochs =20

#定义学习率衰减函数
def scheduler(epoch):
    if epoch < num_epochs * 0.4:
        return learning_rate
    if epoch < num_epochs * 0.8:
        return learning_rate * 0.1
    return learning_rate * 0.01
change_Lr = tfc.python.keras.callbacks.LearningRateScheduler(scheduler)

model.fit(
    x=x_train,
    y=y_train,
    batch_size=batch_size,
    epochs=num_epochs,
    callbacks=[change_Lr]
)

其中在导入指数衰减学习率所需要的包LearningRateScheduler是根据tf自带的keras的位置决定的,这在我的另外一篇博文解决导入LearningRateScheduler失败的问题中提到了。

2.正则化

1、范数正则化

正则化是解决模型过拟合的一种十分有效的方法,简单来说就是通过强制网络的权值只取较小的值来限制网络的复杂性,这使得权值的分布更加“规则”。这被称为“权重正则化”,它是通过在网络的损失函数中增加与权重过大相关的成本来实现的。这种成本有两种:

1、L1 正则化其中添加的成本与权重系数的绝对值成正比(即与权重的“L1范数”成正比)。
2、L2 正则化, 其中增加的成本与权重系数值的平方成正比(即与权重的平方“L2范数”成正比)。L2正则化在神经网络中也称为权值衰减。
L1正则化引入了稀疏性,使一些权重参数为零。L2正则化将惩罚权重参数而不会使它们稀疏,这是L2更常见的一个原因。
在tf.keras中,通过将权重正则化实例作为关键字参数传递给层来添加权重正则化。我们现在添加L2权重正则化。

from tensorflow_core.python.keras import regularizers

weight_decay = 0.001

model = tf.keras.models.Sequential([
keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu, input_shape=(32, 32, 1)),
keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same',kernel_regularizer=regularizers.l2(weight_decay)),。。。。略

l2(weight_decay)表示该层的权重矩阵中的每个系数都会将weight_decay * weight_coefficient_value**2添加到网络的总损失中。请注意,由于此惩罚仅在训练时添加,因此在训练时该网络的损失将远高于测试时。

2、Dropout(丢弃正则化)

Dropout应用于层主要就是在训练期间随机(以一定的概率)“丢弃”(即设置为零)该层的多个输出特征。
下面的dropout_rate=0.5

keras.layers.Dense(units=120, activation=tf.nn.relu),
keras.layers.Dropout(0.5),
keras.layers.Dense(units=84, activation=tf.nn.relu),
keras.layers.Dropout(0.5),
keras.layers.Dense(units=10,activation=tf.nn.softmax)

3.优化器配置

优化器的种类很多,这里只记录常用的几个优化器的配置。

SGD

随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量。

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

参数:
lr:大或等于0的浮点数,学习率
momentum:大或等于0的浮点数,动量参数
decay:大或等于0的浮点数,每次更新后的学习率衰减值
nesterov:布尔值,确定是否使用Nesterov动量

Adam

keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)

参数:
lr:float> = 0.学习率。
beta_1:float,0 <beta <1。一般接近1。一阶矩估计的指数衰减率。
beta_2:float,0 <beta <1。一般接近1。二阶矩估计的指数衰减率。
epsilon:float> = 0.模糊因子。如果None,默认为K.epsilon()。该参数是非常小的数,其为了防止在实现中除以零。
decay:浮动> = 0.每次更新时学习率下降。

RMSprop

除学习率可调整外,建议保持优化器的其他默认参数不变,该优化器通常是面对递归神经网络时的一个良好选择。

keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)

参数:
lr:大或等于0的浮点数,学习率
rho:大或等于0的浮点数
epsilon:大或等于0的小浮点数,防止除0错误

例子

#设置优化器
adam = tf.keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0001)
'''sdg = tf.keras.optimizers.SGD(lr=learning_rate, momentum=0.0, dacay=0.0, nesterov=False)'''
'''adam_optimizer = tf.keras.optimizers.Adam(learning_rate)'''
model.compile(optimizer=adam,
              loss=tf.keras.losses.sparse_categorical_crossentropy,
              metrics=['accuracy']
              )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值