【问题标题】:OSError: Failed to interpret file '/modelvgg.npy' as a pickleOSError:无法将文件“/modelvgg.npy”解释为泡菜
【发布时间】:2025-12-12 22:10:01
【问题描述】:

我在 keras 中使用了预训练的 imagenet VGG16 模型,并在顶部添加了我自己的 Dense。 我正在尝试从我训练的模型中保存和加载权重。

我用来保存模型的代码是

import time
start = time.time()
history = model.fit_generator(generator=train_batches,
                              epochs=epochs,
                              steps_per_epoch=steps_train,
                              #callbacks=callbacks_list,
                              validation_data=valid_batches,
                              validation_steps=steps_valid,
                               shuffle=True)
end = time.time()
model.save("modelvgg.npy")

如果这是不正确的方法,或者是否有更好的方法,请告诉我。

但是当我尝试加载它们时,使用这个,

 def __init__(self, vgg16_npy_path=None, trainable=True):
    if vgg16_npy_path is None:
        path = inspect.getfile(Vgg16)
        path = os.path.abspath(os.path.join(path, os.pardir))
        path = os.path.join(path, "modelvgg.npy")
        vgg16_npy_path = path
        print(path)

    self.data_dict = np.load(vgg16_npy_path, encoding='latin1').item()
    self.trainable = trainable
    print("npy file loaded")

但我收到此错误:

UnpicklingError                           Traceback (most recent call last)
~/.local/lib/python3.6/site-packages/numpy/lib/npyio.py in load(file, mmap_mode, allow_pickle, fix_imports, encoding)
446             try:
--> 447                 return pickle.load(fid, **pickle_kwargs)
448             except Exception:

UnpicklingError: invalid load key, 'H'.

During handling of the above exception, another exception occurred:

OSError                                   Traceback (most recent call last)
<ipython-input-5-d099900e8f3b> in <module>
 46         labels = tf.placeholder(tf.float32, [batch_size, 2])
 47 
---> 48         vgg = vgg16.Vgg16()
 49         model.build(images)
 50         cost = (-1) * tf.reduce_sum(tf.multiply(labels, tf.log(model.prob)), axis=1)

~/Bureau/Grad-CAM_final/model/vgg16.py in __init__(self, vgg16_npy_path, trainable)
 18             print(path)
 19 
---> 20         self.data_dict = np.load(vgg16_npy_path, encoding='latin1').item()
 21         self.trainable = trainable
 22         print("npy file loaded")

~/.local/lib/python3.6/site-packages/numpy/lib/npyio.py in load(file, mmap_mode, allow_pickle, fix_imports, encoding)
448             except Exception:
449                 raise IOError(
--> 450                     "Failed to interpret file %s as a pickle" % repr(file))
451     finally:
452         if own_fid:

OSError: Failed to interpret file '/home/omri/Bureau/Grad-CAM_final/model/modelvgg.npy' as a pickle

关于我可能做错了什么有什么建议吗?提前谢谢你。

【问题讨论】:

  • Keras 不会以 pickle 或 numpy 格式保存模型,它为此使用 HDF5。
  • @MatiasValdenegro 如何以pickle格式保存,我需要将模型保存在文件.npy中
  • 有什么用?你需要对模型做什么?
  • 我想在 Grad-CAM 中使用我的模型(我已经训练过),所以我需要文件 .npy 中的模型来加载 Grad-CAM 的代码
  • 您在说什么 Grad-CAM 实施?你见过keras-vis这个包吗?它采用任何 keras 模型并提供不同类型的可视化,包括 Grad-CAM。我觉得你有一个 XY 问题。

标签: python keras deep-learning computer-vision


【解决方案1】:

这不是加载保存为 HDF5 的 keras 模型的正确方法(因为您使用 model.save 保存它)

self.data_dict = np.load(vgg16_npy_path, encoding='latin1').item()

正确的方法是使用keras.models.load_model:

from keras.models import load_model
model = load_model('your_file.hdf5')

【讨论】: