ZurückAttributeError: Das Objekt „DataParallel“ hat kein Attribut „xxxx“.

Problembeschreibung

Beim Training des Modells erfolgt das Training stufenweise, die zweite Stufe lädt die Parameter des in der ersten Stufe trainierten Modells und trainiert dann
die erste Stufe einschließlich des Codes

    if (train_on_gpu):
        if torch.cuda.device_count() > 1:
            net = nn.DataParallel(net)
        net = net.to(device)

Die zweite Trainingsstufe, einschließlich Code

    if (train_on_gpu):
        if torch.cuda.device_count() > 1:
            netT = nn.DataParallel(netT)
            netS = nn.DataParallel(netS)
        netT = netT.to(device)
        netS = netS.to(device)
-----
    orig_state_dict = torch.load("../models/model.pth")['net']
    new_state_dict = OrderedDict()
    for k, v in orig_state_dict.items():
        name = k.replace('module.', '')
        new_state_dict[name] = v
    netT.load_state_dict(new_state_dict)
-----    
    for param in netS.parameters():
        param.requires_grad = True
    #对源模型 netS 的 pose_fc1 层所有参数都设置为不需要进行反向传播更新。
    for param in netS.pose_fc1.parameters():
        param.requires_grad = False

Das Ergebnis ist ein Fehler

RuntimeError: Error(s) in loading state_dict for DataParallel: Missing key(s) in state_dict: "module.feat.block1.layer.0.conv1.weight", ...........

Lösung:

Kommentieren Sie nn.DataParallel() aus

    if (train_on_gpu):
        if torch.cuda.device_count() > 1:
        	pass
            #netT = nn.DataParallel(netT)
            #netS = nn.DataParallel(netS)
        netT = netT.to(device)
        netS = netS.to(device)
-----
    orig_state_dict = torch.load("../models/model.pth")['net']
    new_state_dict = OrderedDict()
    for k, v in orig_state_dict.items():
        name = k.replace('module.', '')
        new_state_dict[name] = v
    netT.load_state_dict(new_state_dict)
-----    
    for param in netS.parameters():
        param.requires_grad = True
    #对源模型 netS 的 pose_fc1 层所有参数都设置为不需要进行反向传播更新。
    for param in netS.pose_fc1.parameters():
        param.requires_grad = False

Ursachenanalyse

Dies kann durch die inkonsistenten Trainingseinstellungen des Modells in der ersten Stufe und der zweiten Stufe verursacht werden. Beispielsweise wird in der ersten Stufe ein Dual-Card-Training und in der zweiten Stufe ein Single-Card-Training verwendet. Derzeit ist dies nicht der Fall möglich, nn.DataParallel
() zu verwenden

Die von net geladene Netzwerkstruktur hat kein „Modul“, und das in der ersten Stufe gespeicherte Modell verwendet net = nn.DataParallel(net), der Schlüssel des gespeicherten Parameters hat „Modul“, wenn wir es zu diesem Zeitpunkt ausführen, ein Es wird ein Fehler gemeldet, also folgen Sie
dem netT.load_state_dict(new_state_dict)
Netzwerk- missing keys .....Unexpected key(s) in state_dict: "module.features.......
Tutorial. Fügen Sie ein False hinzu, netT.load_state_dict(new_state_dict,False)
damit das Problem im Titel gemeldet wird 解决AttributeError: ‘DataParallel‘ object has no attribute ‘xxxx‘
. Tatsächlich muss beim Laden in der zweiten Stufe das „Modul“ vor dem Schlüssel entfernt werden, damit das Modell funktioniert Parameter können korrekt in das Netzwerk geladen und weiter trainiert werden.
Darüber hinaus kann nn.DataParallel () auskommentiert werden

Fügen Sie hier eine Bildbeschreibung ein

おすすめ

転載: blog.csdn.net/z5z5z5z56/article/details/131999858