繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM