vgg16预训练模型load失败
152*****857 发布于2020-04 浏览:1572 回复:4
0
收藏

RuntimeError: Shape not matching: the Program requires a parameter with a shape of ((61952, 4096)), while the loaded parameter (namely [ fc6_weights ]) has a shape of  ((25088, 4096)).

用的预训练模型是paddlepaddle提供的。我的代码是这样的,也是从别人的项目中复制下来的

class VGGNet(object):
"""
vgg的网络类
"""
def __init__(self, layers=16):
"""
vgg网络构造函数
:param layers:
"""
self.layers = layers

def name(self):
"""
返回网络名字
:return:
"""
return 'vgg-net'

def net(self, input, class_dim=1000):
layers = self.layers
vgg_spec = {
11: ([1, 1, 2, 2, 2]),
13: ([2, 2, 2, 2, 2]),
16: ([2, 2, 3, 3, 3]),
19: ([2, 2, 4, 4, 4])
}
assert layers in vgg_spec.keys(), \
"supported layers are {} but input layer is {}".format(vgg_spec.keys(), layers)

nums = vgg_spec[layers]
conv1 = self.conv_block(input, 64, nums[0], name="conv1_")
conv2 = self.conv_block(conv1, 128, nums[1], name="conv2_")
conv3 = self.conv_block(conv2, 256, nums[2], name="conv3_")
conv4 = self.conv_block(conv3, 512, nums[3], name="conv4_")
conv5 = self.conv_block(conv4, 512, nums[4], name="conv5_")

fc_dim = 4096
fc_name = ["fc6", "fc7", "fc8"]
fc1 = fluid.layers.fc(
input=conv5,
size=fc_dim,
act='relu',
param_attr=fluid.param_attr.ParamAttr(name=fc_name[0] + "_weights"),
bias_attr=fluid.param_attr.ParamAttr(name=fc_name[0] + "_offset"))
fc1 = fluid.layers.dropout(x=fc1, dropout_prob=0.5)
fc2 = fluid.layers.fc(
input=fc1,
size=fc_dim,
act='relu',
param_attr=fluid.param_attr.ParamAttr(name=fc_name[1] + "_weights"),
bias_attr=fluid.param_attr.ParamAttr(name=fc_name[1] + "_offset"))
fc2 = fluid.layers.dropout(x=fc2, dropout_prob=0.5)
fc2.stop_gradient = True
out = fluid.layers.fc(
input=fc2,
size=class_dim,
act='softmax',
param_attr=fluid.param_attr.ParamAttr(name=fc_name[2] + "_weights"),
bias_attr=fluid.param_attr.ParamAttr(name=fc_name[2] + "_offset"))

return out

def conv_block(self, input, num_filter, groups, name=None):
conv = input
for i in range(groups):
conv = fluid.layers.conv2d(
input=conv,
num_filters=num_filter,
filter_size=3,
stride=1,
padding=1,
act='relu',
param_attr=fluid.param_attr.ParamAttr(
name=name + str(i + 1) + "_weights"),
bias_attr=fluid.param_attr.ParamAttr(
name=name + str(i + 1) + "_offset"))
return fluid.layers.pool2d(
input=conv, pool_size=2, pool_type='max', pool_stride=2)

收藏
点赞
0
个赞
共4条回复 最后由189******30回复于2020-04
#5189******30回复于2020-04
#3 z807048861回复
您好,我在使用别人的预训练模型,去训练自己的数据集的时候也遇到了类似的问题,《用Paddle实现高性能目标检测网络:ShuffleNetV2-YOLOv3》,麻烦您讲的细一点,小白一枚,这个问题困扰了很久
展开

预训练模型的话跟这个不一样。如果你用的paddlehub,主要看看自己data_reader用得对不对。

0
#4189******30回复于2020-04

看看这个帖子里的“恢复训练”部分

https://aistudio.baidu.com/aistudio/projectdetail/325575

0
#3z807048861回复于2020-04
#2 189******30回复
加载预训练模型的结构、参数类型,batch_size必须完全一致。

您好,我在使用别人的预训练模型,去训练自己的数据集的时候也遇到了类似的问题,《用Paddle实现高性能目标检测网络:ShuffleNetV2-YOLOv3》,麻烦您讲的细一点,小白一枚,这个问题困扰了很久

0
#2189******30回复于2020-04

加载预训练模型的结构、参数类型,batch_size必须完全一致。

0
TOP
切换版块