[英]Training with step decay not retaining the last epoch when re-running model.fit. Learning rate wrong
我正在尝试通过使用具有逐步衰减学习率的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
时代从零重新开始。
因此,我想问问是否有人知道如何保留上一个纪元的状态,以便可以根据正在训练的当前纪元正确地计算学习率。
fit
函数的initial_epoch
中有参数,您可以使用它。 例如:
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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.