我想保存keras模型,并且想保存每个历元的权重以具有最佳权重。我该怎么做?
任何帮助将不胜感激。
代码:
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
答案 0 :(得分:2)
model.get_weights()将返回张量作为numpy数组。您可以使用np.save()将这些权重保存在扩展名为.npy的文件中。
要节省每个时期的权重,您可以在Keras中使用称为回调的方法。
from keras.callbacks import ModelCheckpoint
在进行model.fit之前,如下定义检查点
checkpoint = ModelCheckpoint(.....)
,将参数'period'分配为1,这将分配时期的周期性。这应该做到。
答案 1 :(得分:1)
我不确定它是否可以工作,但是您可以尝试编写回调,并在回调内部保存权重。
例如
checkpoint = ModelCheckpoint("best_model.hdf5", monitor='loss', verbose=1,
save_best_only=True, mode='auto', period=1)
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test),
callbacks=[checkpoint])
source = https://medium.com/@italojs/saving-your-weights-for-each-epoch-keras-callbacks-b494d9648202
答案 2 :(得分:1)
您应该同时使用model.get_weights()和LambdaCallback函数:
model.get_weights():以Numpy数组的形式返回模型中所有权重张量的列表。
model = Sequential()
weights = model.get_weights()
LambdaCallback :此回调由匿名函数构成,将在适当的时间调用
import json
json_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 函数并将其添加到您的模型:
import json
from keras.callbacks import LambdaCallback
json_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()
答案 3 :(得分:1)
您可以使用tf.keras.callbacks.ModelCheckpoint
编写ModelCheckpoint回调以节省每个时期的权重。如果您使用的是TF2.1
或更高版本的最新Tensorflow,则需要使用save_freq='epoch'
来保存每个纪元的权重,而不是使用period=1
作为其他提到的答案。请检查整个example here
checkpoint_path = "./training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(
checkpoint_path, verbose=1, save_weights_only=True,
# Save weights, every epoch.
save_freq='epoch')
# Create a basic model instance
model=create_model()
model.save_weights(checkpoint_path.format(epoch=0))
model.fit(x_train, y_train,
epochs = 50, callbacks = [cp_callback],
validation_data = (x_test,y_test),
verbose=0)
希望这会有所帮助。谢谢!