训练过程中使用学习率衰减

随机梯度下降算法的性能与学习率有着直接的关系,这是因为学习率决定了参数移动到最优值时的速度。如果学习率过大很可能会越过最优值,如果学习率过小,优化的效率可能过低,收敛时间极长。那么一个很好的解决方案就是学习率衰减——即学习率随着训练的进行逐渐衰减。

在训练过程开始时,使用较大的学习率,这样就能快速收敛;随着训练过程的进行,逐渐降低学习率,这样有助于找到最优解。

目前两种较为流行的学习率衰减方法为:(1)线性衰减        (2)指数衰减

(一)学习率线性衰减:

根据epoch逐步降低学习率。

在Keras中是通过SGD类中的随机梯度下降优化算法实现的,这个类有一个decay衰减率参数。

decay=0时,对学习率没有影响,非零时,学习率呈线性衰减。

公式为:

LearningRate = LearningRate \ast \frac{1}{1+decay\ast epoch}

 在下面代码中,初始学习率设为0.1——这是一个较为高的值。decay设为0.005。

"""
学习率线性衰减
"""
from sklearn import datasets
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from keras.optimizers import SGD

#导入数据
dataset = datasets.load_iris()
x=dataset.data
Y=dataset.target
#随机种子
seed=7
np.random.seed(seed)

#构建模型函数
def create_model(init='glorot_uniform'):
    #构建模型
    model = Sequential()
    model.add(Dense(units=4, activation='relu', input_dim=4, kernel_initializer=init))
    model.add(Dense(units=6, activation='relu', kernel_initializer=init))
    model.add(Dense(units=3, activation='softmax', kernel_initializer=init))

    #模型优化
    learningrate = 0.1
    momentum = 0.9
    dacay_rate = 0.005
    #定义学习率衰减
    sgd = SGD(lr=learningrate, momentum=momentum, decay=dacay_rate, nesterov=False)
    #编译模型
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
    return model

epochs = 200
model = KerasClassifier(build_fn=create_model, epochs=epochs, batch_size=5, verbose=1)
model.fit(x, Y)

结果为:

 

Epoch 1/200
2018-11-05 15:05:48.177490: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
2018-11-05 15:05:48.179412: I tensorflow/core/common_runtime/process_util.cc:69] Creating new thread pool with default inter op setting: 8. Tune using inter_op_parallelism_threads for best performance.

  5/150 [>.............................] - ETA: 7s - loss: 1.0809 - acc: 0.4000
150/150 [==============================] - 0s 2ms/step - loss: 0.7938 - acc: 0.5800
Epoch 2/200

  5/150 [>.............................] - ETA: 0s - loss: 0.2944 - acc: 0.8000
150/150 [==============================] - 0s 203us/step - loss: 0.4864 - acc: 0.6667
Epoch 3/200

  5/150 [>.............................] - ETA: 0s - loss: 0.2835 - acc: 0.8000
150/150 [==============================] - 0s 213us/step - loss: 0.4922 - acc: 0.6533
Epoch 4/200

  5/150 [>.............................] - ETA: 0s - loss: 0.5734 - acc: 0.6000
150/150 [==============================] - 0s 210us/step - loss: 0.4693 - acc: 0.7000

。。。。。。
Epoch 199/200

  5/150 [>.............................] - ETA: 0s - loss: 0.4183 - acc: 0.6000
150/150 [==============================] - 0s 200us/step - loss: 0.4632 - acc: 0.6400
Epoch 200/200

  5/150 [>.............................] - ETA: 0s - loss: 0.5556 - acc: 0.6000
150/150 [==============================] - 0s 247us/step - loss: 0.4639 - acc: 0.6333

 (二)学习率指数衰减:

这种方法通常是通过在固定的epoch周期将学习速率降低50%来实现的。

在Keras中,使用LearningRateScheduler回调,来实现学习率的指数衰减。函数将epoch数值作为一个参数,并将学习率返回到随机梯度下降算法中使用。

"""
学习率指数级衰减
"""
from sklearn import datasets
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from keras.optimizers import SGD
from keras.callbacks import LearningRateScheduler
from math import pow, floor

#导入数据
dataset = datasets.load_iris()
x=dataset.data
Y=dataset.target
#随机种子
seed=7
np.random.seed(seed)

#计算学习率
def step_decay(epoch):
    init_lrate = 0.1#初始学习率定为0.1(较高)
    drop = 0.5#学习率降低50%
    epochs_drop = 10#没10个epochs降低一次
    lrate = init_lrate * pow(drop, floor(1 + epoch) / epochs_drop)
    return lrate

#构建模型函数
def create_model(init='glorot_uniform'):
    #构建模型
    model = Sequential()
    model.add(Dense(units=4, activation='relu', input_dim=4, kernel_initializer=init))
    model.add(Dense(units=6, activation='relu', kernel_initializer=init))
    model.add(Dense(units=3, activation='softmax', kernel_initializer=init))
    # 模型优化
    learningrate = 0.1
    momentum = 0.9
    dacay_rate = 0.0
    # 定义学习率衰减
    sgd = SGD(lr=learningrate, momentum=momentum, decay=dacay_rate, nesterov=False)
    # 编译模型
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
    return model

#学习率指数衰减回调
lrate = LearningRateScheduler(step_decay)

epochs = 200
model = KerasClassifier(build_fn=create_model, epochs=epochs, batch_size=5, verbose=1, callbacks=[lrate])
model.fit(x,Y)

。。。。

Epoch 197/200

  5/150 [>.............................] - ETA: 0s - loss: 1.0988 - acc: 0.0000e+00
150/150 [==============================] - 0s 207us/step - loss: 1.0986 - acc: 0.3333
Epoch 198/200

  5/150 [>.............................] - ETA: 0s - loss: 1.0985 - acc: 0.4000
150/150 [==============================] - 0s 203us/step - loss: 1.0986 - acc: 0.3333
Epoch 199/200

  5/150 [>.............................] - ETA: 0s - loss: 1.0986 - acc: 0.2000
150/150 [==============================] - 0s 200us/step - loss: 1.0986 - acc: 0.3333
Epoch 200/200

  5/150 [>.............................] - ETA: 0s - loss: 1.0986 - acc: 0.4000
150/150 [==============================] - 0s 203us/step - loss: 1.0986 - acc: 0.3333

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
深度学习训练过程学习率衰减是一种常用的技术,可以帮助模型更好地收敛到最优解。以下是几种常见的学习率衰减策略: 1. 学习率衰减:在训练的每个epoch或每个固定的步骤后,将学习率乘以一个衰减因子来降低学习率。例如,每个epoch结束后将学习率乘以0.1,或者每隔一定步骤将学习率减小为原来的一半。 ```python # 定义初始学习率衰减因子 initial_lr = 0.1 decay_factor = 0.1 # 创建优化器并设置初始学习率 optimizer = torch.optim.SGD(model.parameters(), lr=initial_lr) # 在每个epoch结束后进行学习率衰减 for epoch in range(num_epochs): # ... 训练模型 ... # 学习率衰减 lr = initial_lr * (decay_factor ** epoch) for param_group in optimizer.param_groups: param_group['lr'] = lr ``` 2. 学习率阶段性衰减:将训练过程分为多个阶段,每个阶段使用不同的学习率。例如,前10个epoch使用较高的学习率,然后降低到较低的学习率。 ```python # 定义不同阶段的学习率和对应的epoch数 lr_schedule = [ {'epoch': 0, 'lr': 0.1}, {'epoch': 10, 'lr': 0.01}, {'epoch': 20, 'lr': 0.001} ] # 创建优化器并设置初始学习率 optimizer = torch.optim.SGD(model.parameters(), lr=lr_schedule[0]['lr']) # 在每个epoch结束后进行学习率衰减 for epoch in range(num_epochs): # ... 训练模型 ... # 学习率衰减 for schedule in lr_schedule: if epoch >= schedule['epoch']: lr = schedule['lr'] for param_group in optimizer.param_groups: param_group['lr'] = lr ``` 3. 学习率间表衰减:根据训练的总步骤数或总epoch数,使用预定义的学习率衰减函数来动态调整学习率。 ```python from torch.optim.lr_scheduler import StepLR # 创建优化器 optimizer = torch.optim.SGD(model.parameters(), lr=0.1) # 创建学习率衰减策略 scheduler = StepLR(optimizer, step_size=10, gamma=0.1) # 在每个epoch结束后进行学习率衰减 for epoch in range(num_epochs): # ... 训练模型 ... # 更新学习率 scheduler.step() ``` 以上是一些常见的学习率衰减策略,你可以根据实际情况选择适合你的模型和数据集的策略。这些策略可以帮助模型在训练过程更好地收敛,并提高模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值