Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用fit_generator()以最小的验证损失保存模型_Python_Validation_Keras - Fatal编程技术网

Python 使用fit_generator()以最小的验证损失保存模型

Python 使用fit_generator()以最小的验证损失保存模型,python,validation,keras,Python,Validation,Keras,如何使用keras函数fit_generator()来训练并同时保存模型权重,使验证损失最小?您可以使用以下代码保存模型权重 model.save_weights('weights.h5') 您可以使用以下代码保存模型的体系结构: model.save('architecure.h5') 如果空间不是问题,那么您可以存储所有模型并选择验证损失最小的模型 class TestCallback(Callback): def __init__(self, test_data): self.

如何使用keras函数fit_generator()来训练并同时保存模型权重,使验证损失最小?

您可以使用以下代码保存模型权重

model.save_weights('weights.h5')
您可以使用以下代码保存模型的体系结构:

model.save('architecure.h5')
如果空间不是问题,那么您可以存储所有模型并选择验证损失最小的模型

class TestCallback(Callback):
def __init__(self, test_data):
    self.test_data = test_data

def on_epoch_end(self, epoch, logs={}):
    x, y = self.test_data
    loss, acc = self.model.evaluate(x, y, verbose=0)
    print('\nTesting loss: {}, acc: {}\n'.format(loss, acc))

model.fit(X_train, Y_train, validation_data=(X_val, Y_val), 
      callbacks=[TestCallback((X_test, Y_test))])
或者,您可以在每个历元之后使用回调来评估验证损失,并采用当前验证数据损失最低的模型。这可以通过参考以下链接来完成。在本例中,只需更改传递给TestCallback的数据,并使用一个变量来存储当前的最小验证损失

class TestCallback(Callback):
def __init__(self, test_data):
    self.test_data = test_data

def on_epoch_end(self, epoch, logs={}):
    x, y = self.test_data
    loss, acc = self.model.evaluate(x, y, verbose=0)
    print('\nTesting loss: {}, acc: {}\n'.format(loss, acc))

model.fit(X_train, Y_train, validation_data=(X_val, Y_val), 
      callbacks=[TestCallback((X_test, Y_test))])

您可以在定义检查点时设置save\u best\u only=True

from keras.callbacks import EarlyStopping, ModelCheckpoint

early_stop = EarlyStopping(monitor='loss', min_delta=0.001, patience=3, mode='min', verbose=1)
checkpoint = ModelCheckpoint('model_best_weights.h5', monitor='loss', verbose=1, save_best_only=True, mode='min', period=1
现在,在拟合模型时,只需包含参数
callbacks=[early\u stop,checkpoint]
。它将以最低的验证损失保存权重

model.fit_generator(X_train, Y_train, validation_data=(X_val, Y_val), 
      callbacks = [early_stop,checkpoint])
保存模型体系结构 如果还想保存模型体系结构,则需要将模型序列化为JSON:

model_json = model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)
最后用架构和权重加载模型:

# load json and create model
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
# load weights into new model
loaded_model.load_weights("model_best_weights.h5")
print("Loaded model from disk")

# evaluate loaded model on test data
loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
score = loaded_model.evaluate(X, Y, verbose=0)

请参阅:

谢谢。我相信这个回调只保存了模型权重,而没有保存模型架构。因此,如果我必须对我的模型进行推理,我如何加载模型和权重?这太棒了。谢谢我会看一看,这是考虑训练损失而不是验证损失。如何让它考虑验证丢失?@ @ RouthSealMeals=“ValueLead”,而不只是ELSPLOP回调中的“监视器”=“丢失”