【问题标题】:Keras ValueError trying to load modelKeras ValueError 尝试加载模型
【发布时间】:2020-05-29 19:44:44
【问题描述】:

我正在使用 Anaconda Navigator,确切地说是 Jupyter。

import tensorflow as tf 
from tensorflow import keras
print(tf.__version__)
>>> 1.14.0

这是我的模特

def create_model():
  model = tf.keras.Sequential([
    keras.layers.Dense(86, activation='relu', kernel_regularizer=keras.regularizers.l2(0.0001),input_shape=(129,)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(142, activation='relu', kernel_regularizer=keras.regularizers.l2(0.0001)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(4, activation='softmax')
    ])
  return model

model = create_model()

# Display the model's architecture
model.summary()

在训练、预测和评估我的模型后,我决定使用

model.save('/Users/Jennifer/myproject/my_model.h5') 

我用 h5py 文件检查了目录和文件夹。我决定使用

加载它
new_model1 = tf.keras.models.load_model('/Users/Jennifer/myproject/my_model.h5')

我遇到了一个错误

ValueError: Unknown entries in loss dictionary: ['class_name', 'config']. Only expected following keys: ['dense_17']

请帮助我。我应该怎么办?我几乎花了一整天的时间来解决这个问题。谢谢

【问题讨论】:

  • 我认为你错过了其中的一个关键部分,你传递了什么来编译?当您保存模型时,它将保存优化器/训练信息。您可以将 custom_objects 传递给 load_model 以加载这些对象。或者如果你不想要优化器的东西,你可以试试load_weights。
  • @matt 编译:model.compile(optimizer=tf.keras.optimizers.Adam(0.0001), loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True), metrics=['accuracy']).
  • 如果你在保存之前编译你的模型,比如model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy']),你还会得到这个错误吗?告诉我,我很好奇它是否能解决您的问题。
  • @TimbusCalin 不,我没有收到错误消息。它工作得很好。此错误是在保存模型后,我尝试使用命令在单独的 pyfile 中再次加载。
  • 所以它解决了你的问题?

标签: tensorflow keras


【解决方案1】:

这里有一个只是加载权重的解决方法:

#!/usr/bin/env python3

from tensorflow import keras
import os


def create_model():
  model = keras.Sequential([
    keras.layers.Dense(86, activation='relu', kernel_regularizer=keras.regularizers.l2(0.0001),input_shape=(129,)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(142, activation='relu', kernel_regularizer=keras.regularizers.l2(0.0001)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(4, activation='softmax')
    ])
  return model

if os.path.exists("junk.h5"):
    model = create_model()
    model.load_weights("junk.h5")

else:
    model = create_model()
    model.compile(optimizer=keras.optimizers.Adam(0.0001), loss=keras.losses.CategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
    model.save("junk.h5")

另一种解决方法是在没有优化器的情况下保存模型

model.save("junk.h5", include_optimizer=False)

您使用的损失函数似乎创建了一个包含无效键的字典。这听起来像是 keras/tensorflow 中的一个错误。这就是 colab 可能工作的原因,因为它使用的是较新的版本。

【讨论】:

  • 我尝试加载重物,它们工作得很好。我只想要整个模型,仅此而已。
  • 您使用 colab 的经验表明,如果您升级 tensorflow,它可能会起作用。此外,在不使用优化器的情况下保存它对我有用,然后我可以使用“load_model”加载它。您可能会将其作为错误报告给 tensorflow。我怀疑它已在更新的版本中得到修复。
猜你喜欢
  • 2020-06-24
  • 2019-04-10
  • 2020-11-30
  • 2019-06-14
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2020-03-24
  • 2022-10-20
相关资源
最近更新 更多