keras:如何保存培训历史记录

时间:2016-12-09 13:20:56

标签: python machine-learning neural-network deep-learning keras

在Keras中,我们可以将model.fit的输出返回到历史记录,如下所示:

 history = model.fit(X_train, y_train, 
                     batch_size=batch_size, 
                     nb_epoch=nb_epoch,
                     validation_data=(X_test, y_test))

现在,如何将历史记录保存到文件中以供进一步使用(例如,根据时期绘制acc或loss的绘图)?

9 个答案:

答案 0 :(得分:39)

我使用的是以下内容:

    with open('/trainHistoryDict', 'wb') as file_pi:
        pickle.dump(history.history, file_pi)

通过这种方式,我将历史保存为字典,以防我想稍后绘制损失或准确性。

答案 1 :(得分:11)

最简单的方法:

保存:

$('#yourname').val();

正在加载:

var name=$('#yourname').val();

然后,历史记录就是一本字典,您可以使用键检索所有需要的值。

答案 2 :(得分:9)

history个对象的history字段是一个字典,其中包含跨越每个训练时期的不同训练指标。所以例如history.history['loss'][99]将在第100个训练时期内失去你的模型。为了保存你可以pickle这个字典或简单的方法将这个字典中的不同列表保存到适当的文件中。

答案 3 :(得分:8)

model的历史记录可以如下保存到文件中

import json
hist = model.fit(X_train, y_train, epochs=5, batch_size=batch_size,validation_split=0.1)
with open('file.json', 'w') as f:
    json.dump(hist.history, f)

答案 4 :(得分:3)

我遇到了一个问题,即在keras中列表内部的值不是json可序列化的。因此,出于使用原因,我编写了这两个方便的函数。

import json,codecs
import numpy as np
def saveHist(path,history):

    new_hist = {}
    for key in list(history.history.keys()):
        if type(history.history[key]) == np.ndarray:
            new_hist[key] == history.history[key].tolist()
        elif type(history.history[key]) == list:
           if  type(history.history[key][0]) == np.float64:
               new_hist[key] = list(map(float, history.history[key]))

    print(new_hist)
    with codecs.open(path, 'w', encoding='utf-8') as f:
        json.dump(new_hist, f, separators=(',', ':'), sort_keys=True, indent=4) 

def loadHist(path):
    with codecs.open(path, 'r', encoding='utf-8') as f:
        n = json.loads(f.read())
    return n

其中saveHist仅需要获取应保存json文件的路径,以及从keras fitfit_generator方法返回的历史对象。

答案 5 :(得分:1)

另一种方法:

由于history.historydict,因此您也可以将其转换为pandas DataFrame对象,然后可以将其保存以满足您的需求。

逐步:

import pandas as pd

# assuming you stored your model.fit results in a 'history' variable:
history = model.fit(x_train, y_train, epochs=10)

# convert the history.history dict to a pandas DataFrame:     
hist_df = pd.DataFrame(history.history) 

# save to json:  
hist_json_file = 'history.json' 
with open(hist_json_file, mode='w') as f:
    hist_df.to_json(f)

# or save to csv: 
hist_csv_file = 'history.csv'
with open(hist_csv_file, mode='w') as f:
    hist_df.to_csv(f)

答案 6 :(得分:0)

我敢肯定有很多方法可以做到这一点,但是我摆弄了一下,并提出了自己的版本。

首先,自定义回调可在每个时期结束时获取和更新历史记录。在这里,我还有一个回调来保存模型。两者都很方便,因为如果您崩溃或关机,则可以在最后一个完成的纪元接受培训。

class LossHistory(Callback):

    # https://stackoverflow.com/a/53653154/852795
    def on_epoch_end(self, epoch, logs = None):
        new_history = {}
        for k, v in logs.items(): # compile new history from logs
            new_history[k] = [v] # convert values into lists
        current_history = loadHist(history_filename) # load history from current training
        current_history = appendHist(current_history, new_history) # append the logs
        saveHist(history_filename, current_history) # save history from current training

model_checkpoint = ModelCheckpoint(model_filename, verbose = 0, period = 1)
history_checkpoint = LossHistory()
callbacks_list = [model_checkpoint, history_checkpoint]

第二,这是一些“帮助”功能,可以准确地执行他们说的事情。这些都是从LossHistory()回调中调用的。

# https://stackoverflow.com/a/54092401/852795
import json, codecs

def saveHist(path, history):
    with codecs.open(path, 'w', encoding='utf-8') as f:
        json.dump(history, f, separators=(',', ':'), sort_keys=True, indent=4) 

def loadHist(path):
    n = {} # set history to empty
    if os.path.exists(path): # reload history if it exists
        with codecs.open(path, 'r', encoding='utf-8') as f:
            n = json.loads(f.read())
    return n

def appendHist(h1, h2):
    if h1 == {}:
        return h2
    else:
        dest = {}
        for key, value in h1.items():
            dest[key] = value + h2[key]
        return dest

此后,您需要将history_filename设置为data/model-history.json,并将model_filesname设置为data/model.h5。为了确保在训练结束时不会弄乱您的历史记录(假设您停止并开始以及坚持使用回调),最后一项调整是这样做:

new_history = model.fit(X_train, y_train, 
                     batch_size = batch_size, 
                     nb_epoch = nb_epoch,
                     validation_data=(X_test, y_test),
                     callbacks=callbacks_list)

history = appendHist(history, new_history.history)

无论何时,history = loadHist(history_filename)都会恢复您的历史记录。

时髦来自json和列表,但是如果不通过迭代将其转换,我将无法使其工作。无论如何,我知道这行得通,因为我已经将它拉上了好几天。 https://stackoverflow.com/a/44674337/852795pickled.dump答案可能会更好,但我不知道那是什么。如果我在这里错过了任何东西,或者您无法正常工作,请告诉我。

答案 7 :(得分:0)

在训练过程结束时保存历史记录时,上述答案很有用。如果您想在训练期间保存历史记录,则CSVLogger回调将非常有用。

下面的代码以数据表文件 log.csv 的形式保存模型权重和历史训练。

model_cb = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path)
history_cb = tf.keras.callbacks.CSVLogger('./log.csv', separator=",", append=False)

history = model.fit(callbacks=[model_cb, history_cb])

答案 8 :(得分:0)

您可以以.txt形式保存tf.keras.callbacks.History的History属性

with open("./result_model.txt",'w') as f:
    for k in history.history.keys():
        print(k,file=f)
        for i in history.history[k]:
            print(i,file=f)