【问题标题】:"IndexError: list index out of range" When trying to load weights using keras' vgg16“IndexError:列表索引超出范围”尝试使用 keras 的 vgg16 加载权重时
【发布时间】:2017-09-29 10:26:13
【问题描述】:

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

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 是最新的。 我想我在某个地方犯了一个错误,因为其他人似乎没有在下载它的网站的 cmets 中评论过这个错误。

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

【问题讨论】:

    标签: python tensorflow keras index-error


    【解决方案1】:

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

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

    因此,请使用与获得 weights 的链接相同的模型来编译它并按原样加载权重:

    这是对链接处代码的引用:

    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)
    

    【讨论】:

    • 谢谢,工作就像一个魅力。 (我现在感觉好傻……)
    猜你喜欢
    • 2021-12-04
    • 2016-06-28
    • 1970-01-01
    • 2021-10-18
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多