为什么每次训练完的模型的hdf5文件都没能保存下来呀?总是要重新训练

每次训练后,并没有训练好的模型文件hdf5存在指定位置中,是缺少什么保存模型的代码我没写么?新手上路,对比了很多训练模型的案例看不出自己少哪部分代码,求指点!保存记录loss的CSV文件也没能成功保存到文件夹下,很苦恼
【训练模型部分代码】

model_path = "bone_age_model_inception.hdf5"
checkpoint = ModelCheckpoint(model_path, monitor='val_loss', verbose=1, save_best_only=True, mode='min',
save_weights_only=True)
optim = optimizers.Nadam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, schedule_decay=0.0003)
reduceLROnPlat = ReduceLROnPlateau(monitor='val_loss', factor=0.8, patience=3, verbose=1, mode='auto', epsilon=0.0001,
cooldown=5, min_lr=0.0006)
early = EarlyStopping(monitor="val_loss", mode="min",
patience=10) # probably needs to be more patient, but kaggle time is limited
callbacks_list = [checkpoint, early, reduceLROnPlat]

bone_age_model_history = bone_age_model.fit_generator(generator=train_flow,
steps_per_epoch=STEP_SIZE_TRAIN,
validation_data=valid_flow,
validation_steps=STEP_SIZE_VALID,
epochs=EPOCHS,
callbacks=callbacks_list)

loss_history = bone_age_model_history.history['loss'] # 保存训练的loss
history_df = pd.DataFrame.from_dict(bone_age_model_history.history)
history_df.to_csv('./csv/incption_v3_loss_history1r.csv') # 这个csv文件也没有成功保存

print("Training complete !!!\n")

bone_age_model.save('bone_age_model_inception.hdf5') # 保存HDF5模型文件

bone_age_model.load_weights("bone_age_model_inception.hdf5") #加载模型
test_X, test_Y = next(test_flow)
pred_Y = mu + sigma * bone_age_model.predict(x=test_X, batch_size=16, verbose=1)

运行结果及报错内容

运行都正常,没报错,就是hdf5不知道怎么保存到目录里,明明也用了save函数了

我的解答思路和尝试过的方法

尝试过把model_path换成绝对路径,还是无济于事

save模型之后,再用要load。。

我训练的是CNN模型,模型的名字叫做cnn_model,把模型存储和reload的部分截给你,希望对你有帮助。

from tensorflow.keras.models import Sequential,load_model,model_from_json
#save architecture
json_string = cnn_model.to_json()
open('./my_ns_cnnmodel_architecture.json','w').write(json_string)
#save weights
cnn_model.save_weights('./my_ns_cnnmodel_weights.h5')

上面是保存,下面是reload

from tensorflow.keras.models import Sequential,load_model,model_from_json

my_cnn_model = model_from_json(open('./my_model_architecture.json').read()) 
my_cnn_model.load_weights('./my_model_weights.h5')


save_best_only=True,会不会验证loss没有优化,还有既然已经使用了回调函数,为啥后面还保存了一次?
建议你可以重写一下你的generator,让他每个epoch提前终止,然后看看哪里有问题。还可以先把测试和训练分开。
另外,根据我的经验,很可能是fit_generator里的参数有问题,我记得有个参数不写会导致call函数无效,你后面的earlystoping完全没必要。

将模型保存为完整的 HDF5 文件,后面可以直接加载使用:


import tenforflow as tf

model = tf.keras.models.xxxxx
model.compile(xxx)
model.fit(xxx)

import time
saved_model_path = "./saved_models/{}.h5".format(int(time.time()))

model.save(saved_model_path)

重新创建完全相同的模型,包括其权重和优化程序:


import tensorflow as tf

new_model = tf.keras.models.load_model(saved_model_path)