OSError:无法将文件“ /modelvgg.npy”解释为泡菜

时间:2019-03-05 10:24:27

标签: python keras deep-learning computer-vision

我在喀拉拉邦使用了预训练的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

对我可能做错的任何建议吗?预先谢谢你。

1 个答案:

答案 0 :(得分:0)

这不是加载保存为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')