Search code examples
pythontensorflowkerasindex-error

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


I want to load a set of pre-trained weights downloaded from this address:

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

I am using the code below to load the weights:

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))

And getting this error:

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

The image is not cited because as you can see, the problem happens in the 8º line. Tensorflow and Keras up-to-date. I presume I made a mistake somewhere as other people don't seem to have commented anything about this error in the comments of the site where it was downloaded.

What's the problem? Why can't it be loaded?


Solution

  • The problem here is that your attempting to load weights to model that isn't a VGG model yet just the Sequential container. The error is saying that your models dosen't not have any layers and of course it dosent (its just the Sequential container after all).

    You're going to have to define a VGG model and then load the weights.

    So use the model at the same link as where you got the weights to compile it and load the the weights as you are:

    Here is a reference to the code that at the 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)