Keras:改变学习率

Luc*_*rio 26 python keras tensorflow

在使用不同的学习率训练模型后,我正在尝试更改模型的学习率。

在这里这里这里和其他一些我什至找不到的地方阅读。

我试过:

model.optimizer.learning_rate.set_value(0.1)
model.optimizer.lr = 0.1
model.optimizer.learning_rate = 0.1
K.set_value(model.optimizer.learning_rate, 0.1)
K.set_value(model.optimizer.lr, 0.1)
model.optimizer.lr.assign(0.1)
Run Code Online (Sandbox Code Playgroud)

......但他们都没有工作!我不明白这么简单的事情怎么会有如此混乱。我错过了什么吗?

编辑:工作示例

这是我想做的一个工作示例:

from keras.models import Sequential
from keras.layers import Dense
import keras
import numpy as np

model = Sequential()

model.add(Dense(1, input_shape=(10,)))

optimizer = keras.optimizers.Adam(lr=0.01)
model.compile(loss='mse',
              optimizer=optimizer)

model.fit(np.random.randn(50,10), np.random.randn(50), epochs=50)

# Change learning rate to 0.001 and train for 50 more epochs

model.fit(np.random.randn(50,10), np.random.randn(50), initial_epoch=50, epochs=50)
Run Code Online (Sandbox Code Playgroud)

小智 30

您可以按如下方式更改学习率:

from keras import backend as K
K.set_value(model.optimizer.learning_rate, 0.001)
Run Code Online (Sandbox Code Playgroud)

包含在您的完整示例中,如下所示:

from keras.models import Sequential
from keras.layers import Dense
from keras import backend as K
import keras
import numpy as np

model = Sequential()

model.add(Dense(1, input_shape=(10,)))

optimizer = keras.optimizers.Adam(lr=0.01)
model.compile(loss='mse', optimizer=optimizer)

print("Learning rate before first fit:", model.optimizer.learning_rate.numpy())

model.fit(np.random.randn(50,10), np.random.randn(50), epochs=50, verbose=0)

# Change learning rate to 0.001 and train for 50 more epochs
K.set_value(model.optimizer.learning_rate, 0.001)
print("Learning rate before second fit:", model.optimizer.learning_rate.numpy())

model.fit(np.random.randn(50,10), 
          np.random.randn(50), 
          initial_epoch=50, 
          epochs=50,
          verbose=0)
Run Code Online (Sandbox Code Playgroud)

我刚刚用 keras 2.3.1 对此进行了测试。不知道为什么这种方法似乎对你不起作用。


小智 20

还有另一种方法,您必须找到保存学习率的变量并为其分配另一个值。

optimizer = tf.keras.optimizers.Adam(0.001)
optimizer.learning_rate.assign(0.01)
print(optimizer.learning_rate)
Run Code Online (Sandbox Code Playgroud)

输出:

<tf.Variable 'learning_rate:0' shape=() dtype=float32, numpy=0.01>
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案;不需要额外的进口而且更加优雅 (2认同)
  • 这似乎不适用于图形模式 (2认同)

kso*_*all 11

您可以在训练期间更改 lr

from keras.callbacks import LearningRateScheduler

# This is a sample of a scheduler I used in the past
def lr_scheduler(epoch, lr):
    decay_rate = 0.85
    decay_step = 1
    if epoch % decay_step == 0 and epoch:
        return lr * pow(decay_rate, np.floor(epoch / decay_step))
    return lr
Run Code Online (Sandbox Code Playgroud)

将调度程序应用于您的模型

callbacks = [LearningRateScheduler(lr_scheduler, verbose=1)]

model = build_model(pretrained_model=ka.InceptionV3, input_shape=(224, 224, 3))
history = model.fit(train, callbacks=callbacks, epochs=EPOCHS, verbose=1)
Run Code Online (Sandbox Code Playgroud)

  • 回调是唯一的策略吗?我知道这是一种可能的策略,但它是唯一的策略吗?是否存在手动更改它的方法? (2认同)

Orp*_*coz 6

您应该在 compile 函数中定义它:

optimizer = keras.optimizers.Adam(lr=0.01)
model.compile(loss='mse',
              optimizer=optimizer,
              metrics=['categorical_accuracy'])
Run Code Online (Sandbox Code Playgroud)

查看您的评论,如果您想在开始后更改学习率,则需要使用调度程序:链接

使用您的代码和调度程序进行编辑:

from keras.models import Sequential
from keras.layers import Dense
import keras
import numpy as np

def lr_scheduler(epoch, lr):
    if epoch > 50:
        lr = 0.001
        return lr
    return lr

model = Sequential()

model.add(Dense(1, input_shape=(10,)))

optimizer = keras.optimizers.Adam(lr=0.01)
model.compile(loss='mse',
              optimizer=optimizer)

callbacks = [keras.callbacks.LearningRateScheduler(lr_scheduler, verbose=1)]

model.fit(np.random.randn(50,10), np.random.randn(50), epochs=100, callbacks=callbacks)

Run Code Online (Sandbox Code Playgroud)