ValueError:层权重形状(3、3、3、64)与提供的权重形状(64、3、3、3)不兼容

Pra*_*eep 5 python keras

我正在尝试根据图像和文本对产品进行分类,但遇到错误

 img_width, img_height = 224, 224
# build the VGG16 network
model = Sequential()
model.add(ZeroPadding2D((1, 1), input_shape=(img_width, img_height,3), name='image_input'))

model.add(Convolution2D(64, (3, 3), activation='relu', name='conv1_1'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(64, (3, 3), activation='relu', name='conv1_2'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))


# set trainable to false in all layers
for layer in model.layers:
    if hasattr(layer, 'trainable'):
        layer.trainable = False

return model

WEIGHTS_PATH='E:/'
weight_file = ''.join((WEIGHTS_PATH, '/vgg16_weights.h5'))
f = h5py.File(weight_file,mode='r')
for k in range(f.attrs['nb_layers']):
    if k >= len(model.layers):
        # we don't look at the last (fully-connected) layers in the savefile
        break
    g = f['layer_{}'.format(k)]
    weights = [g['param_{}'.format(p)] for p in range(g.attrs['nb_params'])]
    model.layers[k].set_weights(weights)
f.close()
return model

load_weights_in_base_model(get_base_model())
Run Code Online (Sandbox Code Playgroud)

错误:文件“C:\Python\lib\site-packages\keras\engine\topology.py”,第 1217 行,在 set_weights 'provided weight shape' + str(w.shape)) ValueError: Layer weight shape (3, 3, 3, 64) 与提供的配重形状 (64, 3, 3, 3) 不兼容

任何人都可以帮我解决这个错误。提前致谢..

lay*_*yog 5

问题似乎出在线路上

model.layers[k].set_weights(weights)
Run Code Online (Sandbox Code Playgroud)

Keras 使用不同的后端以不同的方式初始化权重。如果您theano用作后端,则权重将被初始化为 acc。对kernels_first,如果你正在使用tensorflow作为后端,那么权重将被初始化累计。到kernels_last

因此,您的问题似乎是您正在使用tensorflow但正在从theano作为后端创建的文件加载权重。解决方案是使用 keras 重塑内核conv_utils

from keras.utils.conv_utils import convert_kernel
reshaped_weights = convert_kernel(weights)
model.layers[k].set_weights(reshaped_weights)
Run Code Online (Sandbox Code Playgroud)

查看了解更多信息

  • 嘿,我正在使用 Theano 后端,但它仍然向我显示相同的错误。之前用的是Tensorflow,现在换成了Theano。当我在张量流中运行您的解决方案时,它给我一个错误(“无效的内核形状:”,(0,))。你知道我该如何修复它吗? (2认同)