我想保存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
函数:
-
model.get_weights():返回模型中所有权重张量的列表,作为Numpy数组。
model = Sequential()weights = model.get_weights()
-
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()