基于VGG16的图文商品分类模型加载权重时形状不兼容错误求助
解决Keras加载VGG16权重时的维度不匹配错误
嘿,我看你在加载VGG16预训练权重时碰到了维度不兼容的问题,这个错误其实挺常见的,核心原因就是权重文件里的卷积核维度顺序和你定义的模型输入格式不匹配。
先拆解下错误提示:Layer weight shape (3, 3, 3, 64)是你的模型期望的卷积核格式(对应Keras默认的channels_last,也就是(height, width, channels, filters)),而你加载的权重格式是(64, 3, 3, 3)(这是channels_first风格的(filters, channels, height, width),常见于Caffe或者旧版框架导出的权重)。
给你两个靠谱的解决办法:
方法一:手动调整权重维度顺序
修改你加载权重的代码,对卷积层的权重进行转置,把维度顺序对齐模型的期望格式:
WEIGHTS_PATH='E:/' # 注意去掉路径里多余的斜杠,避免生成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): break g = f['layer_{}'.format(k)] weights = [g['param_{}'.format(p)] for p in range(g.attrs['nb_params'])] # 只针对卷积层调整权重维度 if isinstance(model.layers[k], Convolution2D): # 把(filters, channels, h, w)转成(h, w, channels, filters) weights[0] = weights[0].transpose((2, 3, 1, 0)) model.layers[k].set_weights(weights) f.close()
方法二:直接用Keras内置的VGG16模型(更省心)
其实Keras已经封装好了预训练的VGG16,完全不用手动折腾权重文件,代码更简洁还不会出错:
from keras.applications.vgg16 import VGG16 img_width, img_height = 224, 224 # 加载不带顶层全连接层的VGG16,weights='imagenet'会自动下载预训练权重 base_model = VGG16(weights='imagenet', include_top=False, input_shape=(img_width, img_height, 3)) # 设置所有层不可训练 for layer in base_model.layers: layer.trainable = False
这种方式会自动适配你的Keras后端格式(TensorFlow默认channels_last,Theano默认channels_first),彻底规避维度问题。
内容的提问来源于stack exchange,提问作者Pradeep
相关产品推荐
相关产品推荐

