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)