在尝试以不同的学习速度训练模型后,我试图更改。
我读了here,here,here和其他一些我什至找不到的地方。
我尝试过:
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)
...但是它们都不起作用! 我不明白在这么简单的事情上怎么会有这种困惑。我想念什么吗?
编辑:工作示例
这是我想做的一个可行的例子:
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)
答案 0 :(得分:13)
您可以如下更改学习率:
from keras import backend as K
K.set_value(model.optimizer.learning_rate, 0.001)
完整示例中包含的内容如下:
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)
我刚刚用keras 2.3.1进行了测试。不确定为什么这种方法似乎不适合您。
答案 1 :(得分:8)
还有另一种方法,您必须找到保存学习率的变量并为其分配另一个值。
optimizer = tf.keras.optimizers.Adam(0.001)
optimizer.learning_rate.assign(0.01)
print(optimizer.learning_rate)
输出:
<tf.Variable 'learning_rate:0' shape=() dtype=float32, numpy=0.01>
答案 2 :(得分:6)
您可以在训练过程中通过以下方式更改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
将调度程序应用于模型
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)
答案 3 :(得分:3)
您应该在编译功能中对其进行定义:
optimizer = keras.optimizers.Adam(lr=0.01)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['categorical_accuracy'])
查看您的评论,如果您想在开始后更改学习率,则需要使用调度程序:link
使用您的代码和计划程序进行编辑:
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)
答案 4 :(得分:2)
假设您在 keras 中使用Adam优化器,则希望在使用它编译模型之前先定义优化器。
例如,您可以定义
myadam = keras.optimizers.Adam(learning_rate=0.1)
然后,使用此优化器编译模型。
如果您想更改优化器(使用不同类型的优化器或使用不同的学习率),则可以定义一个新的优化器并使用新的优化器编译现有模型。
希望这会有所帮助!