我正在尝试使用具有逐步衰减学习率的tf.keras
框架来训练模型。但是,每次调用fit
方法时,学习率都会重新开始,并且不会从其上一个状态继续。
以下代码是演示此问题的最小示例。
import numpy as np
import tensorflow as tf
# Create dummy data
train_x = np.random.randint(10,size=40).reshape(-1,1)
train_y = np.random.randint(2,size=40).reshape(-1,1)
train_set = (train_x,train_y)
val_x = np.random.randint(10,size=20).reshape(-1,1)
val_y = np.random.randint(2,size=20).reshape(-1,1)
val_set = (val_x,val_y)
# Creates the model
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(1,activation='relu',use_bias=False,input_dim=(1)))
model.add(tf.keras.layers.Dense(100,activation='relu',use_bias=False))
model.add(tf.keras.layers.Dense(1,activation='relu',use_bias=False))
# Indicates training parameters
model.compile(loss='mean_squared_error',
optimizer=tf.keras.optimizers.Adam(),
metrics=['accuracy'])
# Set Learning Rate Decay
import math
def step_decay(epoch):
print('---',epoch)
init_lr = 0.001
drop = 0.9
epochs_drop = 1.0
lr = init_lr*math.pow(drop,math.floor((1+epoch)/epochs_drop))
return(lr)
lr_callback = tf.keras.callbacks.LearningRateScheduler(step_decay)
# Prints 0.001
print('Learning Rate: ',tf.keras.backend.eval(model.optimizer.lr))
model.fit(x=train_set[0],y=train_set[1],epochs=2,steps_per_epoch=40,
validation_data=val_set,validation_steps=20,
callbacks=[lr_callback])
# Prints 0.00081
print('Learning Rate: ',tf.keras.backend.eval(model.optimizer.lr))
model.fit(x=train_set[0],y=train_set[1],epochs=2,steps_per_epoch=40,
validation_data=val_set,validation_steps=20,
callbacks=[lr_callback])
# Prints 0.00081
print('Learning Rate: ',tf.keras.backend.eval(model.optimizer.lr))
如您所见,我的step_decay
函数取决于它提供的时代。我希望模型保存它运行的最后一个纪元,并将那个纪元提供给Learning Rate Scheduler,但事实并非如此。每次我运行fit
时,纪元又从零开始。
所以我想问问是否有人知道如何保留最后一个时期的状态,以便可以根据正在训练的当前时期正确地计算学习率。
答案 0 :(得分:2)
initial_epoch
函数的fit
中有一个参数,您可以使用它。例如:
print('Learning Rate: ',tf.keras.backend.eval(model.optimizer.lr))
model.fit(X_train,Y_train1, batch_size=16,
validation_split=.5, verbose=1, epochs=2,
callbacks=[lr_callback])
print('Learning Rate: ',tf.keras.backend.eval(model.optimizer.lr))
您已经将模型训练了两个纪元,现在又重新启动,从这里开始,再运行一个纪元,即epochs = 3。
print('Learning Rate: ',tf.keras.backend.eval(model.optimizer.lr))
model.fit(X_train,Y_train1, batch_size=16,initial_epoch=2,
validation_split=.5, verbose=1, epochs=3,
callbacks=[lr_callback])
print('Learning Rate: ',tf.keras.backend.eval(model.optimizer.lr))