数值错误:层权重形状(3,3,3,64)与提供的权重形状(64,3,3,3)不兼容。

5

我正在尝试基于图像和文本对产品进行分类,但遇到了错误。

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

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

请问有谁能帮助我解决这个错误。谢谢您的帮助。


请提供一个最小工作示例,以便用户可以调试问题。另外,您确定维度匹配了吗?(3,3,3,64)不是(64,3,3,3)! - Thomas
2个回答

5
问题似乎出在这一行。
model.layers[k].set_weights(weights)

Keras使用不同的后端以不同的方式初始化权重。如果您使用的是theano作为后端,则权重将根据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)

查看此链接以获取更多信息。


2
嗨,我正在使用Theano后端,但它仍然显示相同的错误。之前我使用的是Tensorflow,现在我改用Theano了。当我在Tensorflow中运行您的解决方案时,它会给我一个错误(“Invalid kernel shape:”(0,))。你知道怎么解决吗? - Nagesh Katna

0

我曾经通过将图像转换为RGB来解决类似的错误。


您的回答可以通过提供更多支持信息来改进。请[编辑]以添加进一步细节,例如引文或文档,以便他人确认您的答案的正确性。您可以在[帮助中心](/ help / how-to-answer)中找到有关撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接