如何保存Keras模型每个epoch的权重?

我想保存Keras模型,并且希望保存每个epoch的权重以获得最佳权重。我该怎么做呢?

任何帮助都将不胜感激。

代码

def createModel():    input_shape=(1, 22, 5, 3844)    model = Sequential()    #C1    model.add(Conv3D(16, (22, 5, 5), strides=(1, 2, 2), padding='same',activation='relu',data_format= "channels_first", input_shape=input_shape))    model.add(keras.layers.MaxPooling3D(pool_size=(1, 2, 2),data_format= "channels_first",  padding='same'))    model.add(BatchNormalization())    #C2    model.add(Conv3D(32, (1, 3, 3), strides=(1, 1,1), padding='same',data_format= "channels_first",  activation='relu'))#incertezza se togliere padding    model.add(keras.layers.MaxPooling3D(pool_size=(1,2, 2),data_format= "channels_first", ))    model.add(BatchNormalization())     #C3    model.add(Conv3D(64, (1,3, 3), strides=(1, 1,1), padding='same',data_format= "channels_first",  activation='relu'))#incertezza se togliere padding    model.add(keras.layers.MaxPooling3D(pool_size=(1,2, 2),data_format= "channels_first",padding='same' ))    model.add(Dense(64, input_dim=64, kernel_regularizer=regularizers.l2(0.01), activity_regularizer=regularizers.l1(0.01)))    model.add(BatchNormalization())    model.add(Flatten())    model.add(Dropout(0.5))    model.add(Dense(256, activation='sigmoid'))    model.add(Dropout(0.5))    model.add(Dense(2, activation='softmax'))    opt_adam = keras.optimizers.Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)    model.compile(loss='categorical_crossentropy', optimizer=opt_adam, metrics=['accuracy'])    return model

回答:

你应该结合使用model.get_weights()LambdaCallback函数:

  1. model.get_weights():返回模型中所有权重张量的列表,作为Numpy数组。

    model = Sequential()weights = model.get_weights()
  2. LambdaCallback:此回调函数通过匿名函数构造,这些函数将在适当的时间被调用

    import jsonjson_log = open('loss_log.json', mode='wt', buffering=1)json_logging_callback = LambdaCallback(            on_epoch_end=lambda epoch, logs: json_log.write(                json.dumps({'epoch': epoch, 'loss': logs['loss']}) + '\n'),            on_train_end=lambda logs: json_log.close())model.fit(...,          callbacks=[json_logging_callback])

考虑到你的代码,你应该编写一个callback函数并添加到你的model中:

import jsonfrom keras.callbacks import LambdaCallbackjson_log = open('loss_log.json', mode='wt', buffering=1)json_logging_callback = LambdaCallback(            on_epoch_end=lambda epoch, logs: json_log.write(                json.dumps({'epoch': epoch,                             'loss': logs['loss'],                            'weights': model.get_weights()}) + '\n'),            on_train_end=lambda logs: json_log.close())model.compile(loss='categorical_crossentropy',              optimizer=opt_adam,               metrics=['accuracy'])model.fit_generator(..., callbacks=[json_logging_callback])

这段代码会将所有层的权重写入JSON文件。如果你想保存特定层的权重,只需将代码更改为

model.layers[0].get_weights()

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注