MobileNetV2 のいくつかの重みをロードする

1. 提起された質問

        導入時のエッジデバイスのパフォーマンスを考慮すると、ネットワークモデルはより小さい方がよいため、MobilenetV2 の簡易版を使用したいと考えましたが、ネットワークの構造とレイヤー数が制限されていたため、最初は事前学習済みモデルをロードしませんでした。変更されましたが、モデルをトレーニングするのが難しいことがわかりました。後で思ったのですが、ネットワークのレイヤ数を減らしただけなので、ネットワークの重みの予約部分をロードできるでしょうか? おそらくネットワークのトレーニングをスピードアップします。(トレーニングは後で機能します)

2、解決策

        MobilenetV2 の事前学習モデルの構造は次のとおりですが、私のモデルでは各ブロックを 1 回だけスタックする、つまりすべて n=1 です。

        アイデア: MobilenetV2 の pretrained_dict をロードし、独自のモデルをインスタンス化して model_dict を取得し、2 つの state_dict を比較して、pretrained_dict のキー値を削除します。

def mobilenet_v2(pretrained=True):
    model = MobileNetV2(width_mult=1)
    if pretrained:
        # try:
        #    from torch.hub import load_state_dict_from_url
        # except ImportError:
        #    from torch.utils.model_zoo import load_url as load_state_dict_from_url
        # state_dict = load_state_dict_from_url(
        #     'https://www.dropbox.com/s/47tyzpofuuyyv1b/mobilenetv2_1.0-f2a8633.pth.tar?dl=1', progress=True)
        pretrained_dict = torch.load("mobilenetv2_1.0-f2a8633.pth.tar") # 预训练的MobilenetV2
        model_dict = model.state_dict()  # 读取自己的网络的结构参数
        pretrained_dict = {k: v for k, v in pretrained_dict.items() if
                           k in model_dict and (v.shape == model_dict[k].shape)}
        model_dict.update(pretrained_dict)  # 将与 pretrained_dict 中 layer_name 相同的参数更新为 pretrained_dict 的参数
        model.load_state_dict(model_dict) # 加载更新后的参数
    return model

おすすめ

転載: blog.csdn.net/weixin_44855366/article/details/130553739