首页 PaddleHub 帖子详情
如何只加载预训练的vgg16中某些层的参数
收藏
快速回复
PaddleHub 问答预训练模型 746 2
如何只加载预训练的vgg16中某些层的参数
收藏
快速回复
PaddleHub 问答预训练模型 746 2

如何只加载vgg16预训练模型中某些层的参数到我自己的模型里,我模型里的层名字和vgg16的不一样,但shape是一样的。

0
收藏
回复
全部评论(2)
时间顺序
FutureSI
#2 回复于2021-12

存储的各层的数据都是以字典方式存储的,可以考虑手动迁移

0
回复
DeepGeGe
#3 回复于2021-12

给你个参考:

class FSCEmbNet(paddle.nn.Layer):
    """用于从图片中提取特征的网络
    该网络利用预训练的resnet18骨干网络,再连接一个FC层,将图片Embedding层一个指定维度的特征向量

    Args:
        embedding_dim: 指定将图片映射成多少维的特征向量
    """
    def __init__(self, embedding_dim=128):
        super(FSCEmbNet, self).__init__()
        rn18 = resnet18(pretrained=True)

        # 从预训练resnet18模型中将backbone提取出来
        # 加载预训练模型的本质,是将模型中各模块参数进行了赋值。灵活地使用预训练模型,可以按照如下方式从模型中提取所需的模块
        self.backbone = paddle.nn.Sequential(rn18.conv1, rn18.bn1, rn18.relu, rn18.maxpool,
                                             rn18.layer1, rn18.layer2, rn18.layer3, rn18.layer4,
                                             rn18.avgpool, paddle.nn.Flatten())
        self.fc = paddle.nn.Linear(in_features=512, out_features=embedding_dim)

    def forward(self, x):
        x = self.backbone(x)
        x = self.fc(x)

        # 将输出向量归一化
        x = x / paddle.norm(x, axis=1, keepdim=True)
        return x

这里就resnet18,然后去里面取特定的层。

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户