回调函数(CallBacks)是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。
我们可以通过继承keras.callbacks.Callback编写自己的回调函数,回调函数通过类成员self.model访问访问,该成员是模型的一个引用
回调函数的参数:
on_epoch_begin: 在每个epoch开始时调用
on_epoch_end: 在每个epoch结束时调用
on_batch_begin: 在每个batch开始时调用
on_batch_end: 在每个batch结束时调用
on_train_begin: 在训练开始时调用
on_train_end: 在训练结束时调用
具体使用:
本次我们要实现的是,在训练的时候,每次迭代完成之后,print 训练名称,训练进度以及当前的损失函数。
from keras.callbacks import Callback
class LossHistory(Callback):
def __init__(self, epochs, name):
self.epochs = epochs
self.name = name
def on_train_begin(self, logs={}):
self.losses = []
print('starttrain')
def on_epoch_end(self, epoch, logs={}):
self.losses.append(logs.get('loss'))
#这个地方要加1
process = float(epoch+1)/float(self.epochs) *100
print( self.name + "的训练进度为" + str(process) + "loss:" + str(logs.get('loss')))
def on_train_end(self, logs={}):
print("endtrain")
print(self.losses[len(self.losses)-1])
然后在模型的fit中,指定callbacks使用该类即可
def trainModel(trainX,trainY,config,modelname):
'''
trainX,trainY: 训练LSTM模型所需要的数据
config: 配置文件
modelname: 训练模型名称 更新实时进度用
'''
model = Sequential()
model.add(LSTM(
80,
input_shape=(trainX.shape[1], trainX.shape[2]),
return_sequences=True))
model.add(Dropout(config.dropout))
model.add(LSTM(
80,
return_sequences=False))
model.add(Dropout(config.dropout))
model.add(Dense(
trainY.shape[1]))
model.add(Activation("relu"))
model.compile(loss='mse', optimizer='adam')
history = LossHistory(50 , modelname)
model.fit(trainX, trainY, epochs=50, batch_size=64 ,verbose = 2,callbacks=[history])
return model
显示结果