重新运行model.fit时,逐步衰减训练不会保留最后一个历元。学习率错误

时间:2019-01-15 20:16:56

标签: python tensorflow keras

我正在尝试使用具有逐步衰减学习率的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时,纪元又从零开始。

所以我想问问是否有人知道如何保留最后一个时期的状态,以便可以根据正在训练的当前时期正确地计算学习率。

1 个答案:

答案 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))