是否有人在加载 Keras 保存的模型时得到“AttributeError: 'str' object has no attribute 'decode'”
Posted
技术标签:
【中文标题】是否有人在加载 Keras 保存的模型时得到“AttributeError: \'str\' object has no attribute \'decode\'”【英文标题】:Does Any one got "AttributeError: 'str' object has no attribute 'decode' " , while Loading a Keras Saved Model是否有人在加载 Keras 保存的模型时得到“AttributeError: 'str' object has no attribute 'decode'” 【发布时间】:2019-05-13 09:55:51 【问题描述】:训练后,我使用
保存了 Keras 整个模型和唯一权重model.save_weights(MODEL_WEIGHTS) and model.save(MODEL_NAME)
模型和权重已成功保存,没有错误。 我可以简单地使用 model.load_weights 成功加载权重,它们很好,但是当我尝试通过 load_model 加载保存模型时,我收到错误。
File "C:/Users/Rizwan/model_testing/model_performance.py", line 46, in <module>
Model2 = load_model('nasnet_RS2.h5',custom_objects='euc_dist_keras': euc_dist_keras)
File "C:\Users\Rizwan\AppData\Roaming\Python\Python36\site-packages\keras\engine\saving.py", line 419, in load_model
model = _deserialize_model(f, custom_objects, compile)
File "C:\Users\Rizwan\AppData\Roaming\Python\Python36\site-packages\keras\engine\saving.py", line 321, in _deserialize_model
optimizer_weights_group['weight_names']]
File "C:\Users\Rizwan\AppData\Roaming\Python\Python36\site-packages\keras\engine\saving.py", line 320, in <listcomp>
n.decode('utf8') for n in
AttributeError: 'str' object has no attribute 'decode'
我从未收到此错误,我曾经成功加载任何模型。我正在使用带有 tensorflow 后端的 Keras 2.2.4。蟒蛇 3.6。 我的培训代码是:
from keras_preprocessing.image import ImageDataGenerator
from keras import backend as K
from keras.models import load_model
from keras.callbacks import ReduceLROnPlateau, TensorBoard,
ModelCheckpoint,EarlyStopping
import pandas as pd
MODEL_NAME = "nasnet_RS2.h5"
MODEL_WEIGHTS = "nasnet_RS2_weights.h5"
def euc_dist_keras(y_true, y_pred):
return K.sqrt(K.sum(K.square(y_true - y_pred), axis=-1, keepdims=True))
def main():
# Here, we initialize the "NASNetMobile" model type and customize the final
#feature regressor layer.
# NASNet is a neural network architecture developed by Google.
# This architecture is specialized for transfer learning, and was discovered via Neural Architecture Search.
# NASNetMobile is a smaller version of NASNet.
model = NASNetMobile()
model = Model(model.input, Dense(1, activation='linear', kernel_initializer='normal')(model.layers[-2].output))
# model = load_model('current_best.hdf5', custom_objects='euc_dist_keras': euc_dist_keras)
# This model will use the "Adam" optimizer.
model.compile("adam", euc_dist_keras)
lr_callback = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=0.003)
# This callback will log model stats to Tensorboard.
tb_callback = TensorBoard()
# This callback will checkpoint the best model at every epoch.
mc_callback = ModelCheckpoint(filepath='current_best_mem3.h5', verbose=1, save_best_only=True)
es_callback=EarlyStopping(monitor='val_loss', min_delta=0, patience=4, verbose=0, mode='auto', baseline=None, restore_best_weights=True)
# This is the train DataSequence.
# These are the callbacks.
#callbacks = [lr_callback, tb_callback,mc_callback]
callbacks = [lr_callback, tb_callback,es_callback]
train_pd = pd.read_csv("./train3.txt", delimiter=" ", names=["id", "label"], index_col=None)
test_pd = pd.read_csv("./val3.txt", delimiter=" ", names=["id", "label"], index_col=None)
# train_pd = pd.read_csv("./train2.txt",delimiter=" ",header=None,index_col=None)
# test_pd = pd.read_csv("./val2.txt",delimiter=" ",header=None,index_col=None)
#model.summary()
batch_size=32
datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = datagen.flow_from_dataframe(dataframe=train_pd,
directory="./images", x_col="id", y_col="label",
has_ext=True,
class_mode="other", target_size=(224, 224),
batch_size=batch_size)
valid_generator = datagen.flow_from_dataframe(dataframe=test_pd, directory="./images", x_col="id", y_col="label",
has_ext=True, class_mode="other", target_size=(224, 224),
batch_size=batch_size)
STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size
STEP_SIZE_VALID = valid_generator.n // valid_generator.batch_size
model.fit_generator(generator=train_generator,
steps_per_epoch=STEP_SIZE_TRAIN,
validation_data=valid_generator,
validation_steps=STEP_SIZE_VALID,
callbacks=callbacks,
epochs=20)
# we save the model.
model.save_weights(MODEL_WEIGHTS)
model.save(MODEL_NAME)
if __name__ == '__main__':
# freeze_support() here if program needs to be frozen
main()
【问题讨论】:
【参考方案1】:使用以下命令降级 h5py 包以解决问题,
pip install h5py==2.10.0 --force-reinstall
【讨论】:
【参考方案2】:对我有用的解决方案是:
pip3 uninstall keras
pip3 uninstall tensorflow
pip3 install --upgrade pip3
pip3 install tensorflow
pip3 install keras
【讨论】:
【参考方案3】:在我的环境中安装了 tensorflow==2.4.1、h5py==2.1.0 和 python 3.8 后,我仍然遇到此错误。 修复它的原因是将 python 版本降级到 3.6.9
【讨论】:
【参考方案4】:我使用以下命令降级了我的 h5py 包,
pip install 'h5py==2.10.0' --force-reinstall
重新启动我的 ipython 内核,它工作正常。
【讨论】:
由于缺少 RECORD 文件,使用这个确切的命令会导致 OSError。不过使用conda install 'h5py==2.10.0'
有效。【参考方案5】:
使用 TF 格式文件而不是 h5py 保存:save_format='tf'。就我而言:
model.save_weights("NMT_model_weight.tf",save_format='tf')
【讨论】:
【参考方案6】:对我来说,是 h5py 的版本优于我之前的版本。
通过设置为2.10.0
来修复它。
【讨论】:
【参考方案7】:我遇到了同样的问题,解决了将compile=False
放入load_model
:
model_ = load_model('path to your model.h5',custom_objects='Scale': Scale(), compile=False)
sgd = SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True)
model_.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
【讨论】:
我们为什么需要custom_objects='Scale': Scale()
?
无论如何,compile = False
给了我这个错误,File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/saving.py", line 229, in load_model model_config = json.loads(model_config.decode('utf-8')) AttributeError: 'str' object has no attribute 'decode'
我也有同样的问题,但 compile=False 无关紧要:(
没用。【参考方案8】:
对我来说,解决方案是降级 h5py
包(在我的情况下为 2.10.0),显然只将 Keras 和 Tensorflow 恢复到正确的版本是不够的。
【讨论】:
更多关于这个问题:github.com/tensorflow/tensorflow/issues/44467 来自 alexhg 的链接,We will have people working on making TF work with h5py >= 3 in the future, but this will only land in TF 2.5 or later.
出现此问题是因为 TensorFlow 无法与 h5py v3 和更新版本一起使用。 2.10.0 是最新版本-2.x.y.
成功了!我试图以 .h5 格式加载 keras 模型,然后将其保存为 tflite 模型。
很遗憾,2.10.0 版本的处理器 2 GHz 四核 Intel Core i5 没有 cp95 滚轮,出现不支持错误,而 3..1.0 出现问题。
这对我有用,非常感谢!一般的经验法则是检查 Tensorflow、Keras 或任何其他主要库,并与其他依赖项(如 numpy、h5py、opencv 等)相关联。使用常识和直觉调整版本。【参考方案9】:
这可能是由于从不同版本的 keras 保存的模型。从 keras 2.2.6 加载由 tensorflow.keras 生成的模型(我认为类似于 keras 2.1.6 for tf 1.12)时,我遇到了同样的问题。
您可以使用model.load_weights
加载权重,然后从您要使用的 keras 版本中重新保存完整的模型。
【讨论】:
但它也发生在我用来训练模型的同一台机器上。同样的错误... 是的,你是对的,model.load_weights
我可以做到这一点,但我想知道为什么我不能加载整个模型架构以上是关于是否有人在加载 Keras 保存的模型时得到“AttributeError: 'str' object has no attribute 'decode'”的主要内容,如果未能解决你的问题,请参考以下文章
加载 Keras 中 callbakcs.ModelCheckpoint() 保存的模型时出错