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