"IndexError: list index out of range" When trying to load weights using keras' vgg16

"IndexError: list index out of range" When trying to load weights using keras' vgg16

我想加载一组从这个地址下载的预训练权重:

https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3

我正在使用下面的代码加载权重:

import os
from PIL import Image
import tensorflow
from keras.models import Sequential

im = Image.open("test.png")
model_vgg = Sequential()
model = model_vgg.load_weights("vgg16_weights.h5")
print(model.predict_classes(im))

出现此错误:

Using TensorFlow backend.
Traceback (most recent call last):
  File "predict.py", line 8, in <module>
    model = model_vgg.load_weights("vgg16_weights.h5")
  File "C:\Users\Cliente\AppData\Local\Programs\Python\Python35\lib\site-packag
s\keras\models.py", line 707, in load_weights
    if legacy_models.needs_legacy_support(self):
  File "C:\Users\Cliente\AppData\Local\Programs\Python\Python35\lib\site-packag
s\keras\legacy\models.py", line 5, in needs_legacy_support
    return isinstance(model.layers[0], Merge)
IndexError: list index out of range

没有引用图像,因为如您所见,问题发生在 8º 线上。 Tensorflow 和 Keras 是最新的。 我想我在某个地方犯了一个错误,因为其他人似乎没有在下载它的网站的评论中对此错误发表任何评论。

有什么问题吗?为什么加载不出来?

这里的问题是您试图将权重加载到不是 VGG 模型而只是 Sequential 容器的模型。错误是说你的模型没有任何层,当然它没有(毕竟它只是顺序容器)。

您将必须定义一个 VGG 模型,然后然后加载权重。

因此,在获得 weights 的地方 link 使用模型来编译它并按原样加载权重:

这里是对 link:

处的代码的引用
from keras.models import Sequential

from keras.layers.core import Flatten, Dense, Dropout
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
from keras.optimizers import SGD
import cv2, numpy as np

def VGG_16(weights_path=None):
    model = Sequential()
    model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))
    model.add(Convolution2D(64, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(64, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(128, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(128, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(256, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(256, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(256, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(Flatten())
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1000, activation='softmax'))

    if weights_path:
        model.load_weights(weights_path)

    return model

if __name__ == "__main__":
    im = cv2.resize(cv2.imread('cat.jpg'), (224, 224)).astype(np.float32)
    im[:,:,0] -= 103.939
    im[:,:,1] -= 116.779
    im[:,:,2] -= 123.68
    im = im.transpose((2,0,1))
    im = np.expand_dims(im, axis=0)

    # Test pretrained model
    model = VGG_16('vgg16_weights.h5')
    sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(optimizer=sgd, loss='categorical_crossentropy')
    out = model.predict(im)
    print np.argmax(out)