二、错误:KeyError: "Can't open attribute (can't locate attribute: 'layer_names')"

  本博客主要内容为使用Keras实例化深度学习模型,并对在这个过程中遇到的问题进行总结,主要参考《Keras中文文档》,在配置环境、安装软件以及调试的过程中遇到的各种问题主要参考各个网页,这些网页会在必要时给出参考。

  如本篇博客没有解决你的问题可在评论区留言,如果能帮上的一定会帮助;如果觉得解决了你的问题请在最下面顶一下;也欢迎指导、提问、留言~~~~

  刚刚入门的大家普遍不具有较好的实验设备,即使有实验设备调整实验参数也是一个费时费力的工作。所以大家可以使用预训练好的模型进行迁移学习,这样可以大大节省时间,而最为给力的时 Keras 中包括已经预训练好的各类卷积神经网络,可以直接 import ,但是有时也会报错,比如说如下的错误

Traceback (most recent call last):
  File "my_VGG16_21.py", line 11, in 
    model = VGG16(weights='imagenet', include_top=False)
  File "/usr/local/lib/python2.7/dist-packages/keras/applications/vgg16.py", line 170, in VGG16
    model.load_weights(weights_path)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py", line 2619, in load_weights
    load_weights_from_hdf5_group(f, self.layers)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py", line 3056, in load_weights_from_hdf5_group
    layer_names = [n.decode('utf8') for n in f.attrs['layer_names']]
  File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "/usr/local/lib/python2.7/dist-packages/h5py/_hl/attrs.py", line 60, in __getitem__
    attr = h5a.open(self._id, self._e(name))
  File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "h5py/h5a.pyx", line 77, in h5py.h5a.open
KeyError: "Can't open attribute (can't locate attribute: 'layer_names')"

在百度上搜索错误“KeyError: “Can’t open attribute (can’t locate attribute: ‘layer_names’)””,基本上找不到相关的答案,而谷歌中遇到这个问题的人不在少数。一个较为普遍的答案是,由于Keras版本的变化导致其中需要导入的权重文件(比如说“vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5”)也需要变化。但是博主使用的默认的程序,应该通过网络自动下载权重,然而并没有成功,其主要原因在于博主没有科学上网。

  首先应该检查你的电脑是否可以打开存放制定权重文件的网址。具体方法为先找到VGG16的定义处,再进行修改。根据

from keras.applications.vgg16 import VGG16

可以知道,函数 VGG16 定义在 keras 文件夹中的 applications 文件夹中的 vgg16 文件,打开该文件找到“WEIGHTS_PATH_NO_TOP”所对应的网址,使用浏览器打开。

  果然发现无法打开这个网址,所以要从其他途径下载对应的权重文件。这里博主使用的是Keras2.0.4,最近好像是已经升级到Keras2.0.8了。在《Keras中文文档》的“当前版本与更新”部分给出了 Keras2.0.4 的中文文档以及权重文件的百度云盘,大家可以在里面选择自己需要的权重文件。

  其次要将VGG16代码中从网上下载权重文件改为使用本地的权重文件。具体方法为通过终端打开 VGG16 文件(因为如果你是安装在系统文件夹中是无法直接修改文件的,所以需要从终端打开文件),即打开终端输入

cd /usr/local/lib/python2.7/dist-packages/keras/applications
sudo gedit vgg16.py

其中/usr/local/lib/python2.7/dist-packages/keras是安装keras的地方,如果你安装的位置与我不一样,需要按照自己的安装位置进行修改。
  最后,打开vgg16.py 文件后进行如下修改

# load weights
    if weights == 'imagenet':
        if include_top:
            weights_path = get_file('vgg16_weights_tf_dim_ordering_tf_kernels.h5',
                                    WEIGHTS_PATH,
                                    cache_subdir='models')
        else:
            # weights_path = get_file('vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5',
            #                         WEIGHTS_PATH_NO_TOP,
            #                         cache_subdir='models')
            weights_path = '/home/lib321/my_keras/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5'

即用最后一行的代码代替被注释的那三行代码,其中最后一行所指代的是存放着权重文件的路径

  完成上述修改后,再运行代码就不会出现如上的报错了。

  如本篇博客没有解决你的问题可在评论区留言,如果能帮上的一定会帮助;
  如果觉得解决了你的问题请在左侧点一下 喜欢 ~;
  也欢迎指导、提问、留言~~~~

你可能感兴趣的:(Keras源码分析及其他,KeyError,keras,VGG16,h5,h5py)