Nik*_*kSp 6 python deep-learning keras tensorflow
我使用TensorFlow 插件中的 HammingLoss 指标创建并训练了一个 TensorFlow 模型。因此,它不是我自己创建的自定义指标。我将回调函数与方法结合使用ModelCheckpoint(),EarlyStopping分别保存最佳模型的最佳权重并在给定阈值停止模型训练。当我保存模型检查点时,我会序列化整个模型结构(类似于model.save()),而不是model.save_weights(),这只会保存模型权重(有关 ModelCheckpoint 的更多信息,请参见此处)。
TL;DR: 这是一个 Colab 笔记本,其中包含我在下面发布的代码,以防您想跳过此步骤。
我训练过的模型保存在此处链接的 GoogleDrive 中。要加载特定模型,我使用以下代码:
neural_network_parameters = {}
#======================================================================
# PARAMETERS THAT DEFINE THE NEURAL NETWORK STRUCTURE =
#======================================================================
neural_network_parameters['model_loss'] = tf.keras.losses.BinaryCrossentropy(from_logits=False, name='binary_crossentropy')
neural_network_parameters['model_metric'] = [tfa.metrics.HammingLoss(mode="multilabel", name="hamming_loss"),
tfa.metrics.F1Score(17, average="micro", name="f1_score_micro"),
tfa.metrics.F1Score(17, average=None, name="f1_score_none"),
tfa.metrics.F1Score(17, average="macro", name="f1_score_macro"),
tfa.metrics.F1Score(17, average="weighted", name="f1_score_weighted")]
"""Initialize the hyper parameters tuning the model using Tensorflow's hyperparameters module"""
HP_HIDDEN_UNITS = hp.HParam('batch_size', hp.Discrete([32]))
HP_EMBEDDING_DIM = hp.HParam('embedding_dim', hp.Discrete([50]))
HP_LEARNING_RATE = hp.HParam('learning_rate', hp.Discrete([0.001])) # Adam default: 0.001, SGD default: 0.01, RMSprop default: 0.001....0.1 to be removed
HP_DECAY_STEPS_MULTIPLIER = hp.HParam('decay_steps_multiplier', hp.Discrete([10]))
METRIC_ACCURACY = "hamming_loss"
dependencies = {
'hamming_loss': tfa.metrics.HammingLoss(mode="multilabel", name="hamming_loss"),
'attention': attention(return_sequences=True)
}
def import_trained_keras_model(model_index, method, decay_steps_mode, optimizer_name, hparams):
"""Load the model"""
training_date="2021-02-27"
model_path_structure=f"{folder_path_model_saved}/{initialize_notebbok_variables.saved_model_name}_{hparams[HP_EMBEDDING_DIM]}dim_{hparams[HP_HIDDEN_UNITS]}batchsize_{hparams[HP_LEARNING_RATE]}lr_{hparams[HP_DECAY_STEPS_MULTIPLIER]}decaymultiplier_{training_date}"
model_imported=load_model(f"{model_path_structure}", custom_objects=dependencies)
if optimizer_name=="adam":
optimizer = optimizer_adam_v2(hparams)
elif optimizer_name=="sgd":
optimizer = optimizer_sgd_v1(hparams, "step decay")
else:
optimizer = optimizer_rmsprop_v1(hparams)
model_imported.compile(optimizer=optimizer,
loss=neural_network_parameters['model_loss'],
metrics=neural_network_parameters['model_metric'])
print(f"Model {model_index} is loaded successfully\n")
return model_imported
Run Code Online (Sandbox Code Playgroud)
调用函数import trained keras model
"""Now that the functions have been created it's time to import each trained classifier from the selected dictionary of hyper parameters, calculate the evaluation metric per model and finally serialize the scores dataframe for later use."""
list_models=[] #a list to store imported models
model_optimizer="adam"
for batch_size in HP_HIDDEN_UNITS.domain.values:
for embedding_dim in HP_EMBEDDING_DIM.domain.values:
for learning_rate in HP_LEARNING_RATE.domain.values:
for decay_steps_multiplier in HP_DECAY_STEPS_MULTIPLIER.domain.values:
hparams = {
HP_HIDDEN_UNITS: batch_size,
HP_EMBEDDING_DIM: embedding_dim,
HP_LEARNING_RATE: learning_rate,
HP_DECAY_STEPS_MULTIPLIER: decay_steps_multiplier
}
print(f"\n{len(list_models)+1}/{(len(HP_HIDDEN_UNITS.domain.values)*len(HP_EMBEDDING_DIM.domain.values)*len(HP_LEARNING_RATE.domain.values)*len(HP_DECAY_STEPS_MULTIPLIER.domain.values))}")
print({h.name: hparams[h] for h in hparams},'\n')
model_object=import_trained_keras_model(len(list_models)+1, "import custom trained model", "on", model_optimizer, hparams)
list_models.append(model_object)
Run Code Online (Sandbox Code Playgroud)
当我调用该函数时,出现以下错误
ValueError:当前无法恢复类型为 _tf_keras_metric 的自定义对象。
get_config保存时请确保图层已实现from_config。另外,custom_objects调用时请使用argload_model()。
奇怪的是,我收到此错误,因为编译 NN 的模型度量来自 TensorFlow 的内置方法,而不是我自己开发的某种自定义指标。
我还在 GitHub 中搜索了该线程,该线程已关闭,但没有解释问题的根源。
[更新]--找到一个临时解决方案
我成功地通过转动来导入模型compile参数设置为 False 成功导入模型,以便重新编译函数内导入的模型。
所以我做了类似的事情model_imported=load_model(f"{model_path_structure}", custom_objects=dependencies, compile=False)。
此操作产生了以下结果:
警告:tensorflow:无法恢复自定义指标。保存时请确保图层实现
get_config并。from_config另外,custom_objects调用时请使用argload_model()。
模型1加载成功。
因此 TensorFlow 仍然无法理解 HammingLoss 不是自定义指标,而是从 Tensorflow Addons 导入的指标。然而,尽管出现警告,模型仍成功加载。
| 归档时间: |
|
| 查看次数: |
3301 次 |
| 最近记录: |