【问题标题】:How to integrate Keras Callbacks and History plotting functionality within a Python function?如何在 Python 函数中集成 Keras 回调和历史绘图功能?
【发布时间】:2020-07-08 06:03:30
【问题描述】:

我已经构建了一个模型拟合函数(如下所示),它被其他一些 Python 函数用来计算 RMSE(评估指标),目前它工作正常。

但是,我还想对以下代码实现另外两个方面。首先,我希望能够绘制训练和验证数据集的损失曲线(通常由代码中显示的 model.fit 函数作为历史对象返回)。其次,我还想实现对 model.fit 函数的 Tensorboard 回调。

我现在面临的挑战是,我不确定如何将这些额外的功能实现到下面的代码中,或者可能在这段代码中。

我尝试使用以下代码(在下面显示的主要 Python 函数中)返回历史记录:

history = model.fit(train_x, train_y, validation_split=0.3, epochs=n_epochs, batch_size=n_batch, verbose=1)
'''
'''
     return model, history

但是,因为“历史”作为主函数中的对象返回,所以我无法在函数之外的任何地方使用此对象来绘制损失曲线。

# Python Function
def model_fit(train, config):
    
    # Prepare data
    data = series_to_supervised(train, n_input)
    train_x, train_y = data[:, :-1], data[:, -1]
    train_x = train_x.reshape((train_x.shape[0], n_seq, n_steps, 1))
    
    # Define Model
    model = Sequential()
    model.add(TimeDistributed(Conv1D(filters=n_filters, kernel_size=n_kernel, activation='relu', input_shape=(None,n_steps,1))))
    model.add(TimeDistributed(Conv1D(filters=n_filters, kernel_size=n_kernel, activation='relu')))
    model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
    model.add(TimeDistributed(Flatten()))
    model.add(Bidirectional(LSTM(n_nodes, activation='relu')))
    model.add(Dense(n_nodes, activation='relu'))
    model.add(Dense(1))
    model.compile(loss='mse', optimizer='adam', metrics=['mse'])
    
    # Fit Model
    model.fit(train_x, train_y, validation_split=0.3, epochs=n_epochs, batch_size=n_batch, verbose=1)
    return model

我是否可以在如图所示的 Python 函数中实现所有这些,以及如何实现?或者我是否需要将整个神经网络写成一个独立的可执行文件而不是一个函数?这样我就可以使用 History 对象并利用所有 Keras 回调?

我可以执行这个函数并立即自动返回历史对象和 Keras 回调吗?

任何建议或帮助将不胜感激。

【问题讨论】:

  • 这是什么意思:但是,因为“历史”在主函数中作为对象返回,所以我无法在函数之外的任何地方使用该对象来绘制损失曲线。
  • @NicolasGervais 我的意思是说,model.fit 会返回一个历史回调。由于 model.fit 恰好在 main 函数中,所以我无法在不调用 main 函数的情况下调用 History。
  • 只是保存这个历史对象?从函数中返回它

标签: python function tensorflow keras


【解决方案1】:

我已经从 Python 函数中提取了细节,而是将实现作为一个独立的脚本执行(只是为了能够返回 History 对象并可视化绘图)。

from timeit import default_timer as timer
from datetime import datetime
from keras.callbacks import Callback
from keras.callbacks import ModelCheckpoint, EarlyStopping

class TimingCallback(keras.callbacks.Callback):
    def __init__(self, logs={}):
        self.logs=[]
    def on_epoch_begin(self, epoch, logs={}):
        self.starttime = timer()
    def on_epoch_end(self, epoch, logs={}):
        self.logs.append(timer()-self.starttime)

# unpack config
n_seq, n_steps, n_filters, n_kernel, n_nodes, n_epochs, n_batch = config
n_input = n_seq * n_steps

# prepare data
data = series_to_supervised(train, n_input)
train_x, train_y = data[:, :-1], data[:, -1]
train_x = train_x.reshape((train_x.shape[0], n_seq, n_steps, 1))

# simple early stopping
es = EarlyStopping(monitor='val_loss', mode='min', verbose=0, patience=60, min_delta=1)
mc = ModelCheckpoint('Asset_5_best_model.h5', monitor='val_loss', mode='min', verbose=1, save_best_only=True)

# Define Model
model = Sequential()
model.add(TimeDistributed(Conv1D(filters=n_filters, kernel_size=n_kernel, activation='relu', input_shape=(None,n_steps,1))))
model.add(TimeDistributed(Conv1D(filters=n_filters, kernel_size=n_kernel, activation='relu')))
model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
model.add(TimeDistributed(Flatten()))
model.add(Bidirectional(LSTM(n_nodes, activation='relu')))
model.add(Dense(n_nodes, activation='relu'))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam', metrics=['mse'])

# Fit Model
time = TimingCallback()
history = model.fit(train_x, train_y, validation_split=0.3, epochs=n_epochs, batch_size=n_batch, verbose=1, callbacks=[es, mc, time])

【讨论】:

  • 目前这个脚本正在按我的预期工作。如果有其他解决方案,我会欢迎。
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 2012-05-26
  • 2013-11-21
  • 2019-09-10
  • 1970-01-01
  • 2010-11-06
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多