Bert + Resnet联合学习,实例化后pytorch模型为空

时间:2020-06-10 19:26:19

标签: pytorch resnet bert-language-model torchvision

我正在编写一个简单的联合模型,该模型有两个分支,一个分支是resnet50,另一个是bert。我将两个输出连接起来,然后传递给带有2个输出神经元的简单线性层。

我实现了以下模型:

import torch
from torch import nn
import torchvision.models as models
import torch.nn as nn
from collections import OrderedDict
from transformers import BertModel

class BertResNet(nn.Module):
    def __init__(self):
        super(BertResNet, self).__init__()
        # resnet
        resnet50 = models.resnet50(pretrained=True)
        n_inputs = resnet50.fc.in_features
        # compressed embedding space
        classifier = nn.Sequential(OrderedDict([
            ('fc1', nn.Linear(n_inputs, 512))
        ]))

        resnet50.fc = classifier # 512 out resnet 


        bert = BertModel.from_pretrained('bert-base-uncased')

        # final classification layer

        classification = nn.Linear(512 + 768, 2)
        #print(resnet50)
        #print(bert)

    def forward(self, img, text):
        res_emb = self.resnet50(img)
        bert_emb = self.bert(text)

        combined = torch.cat(res_emb,
                              bet_emb, dim=1)
        out = self.classification(combined)
        return out

但是当我实例化时,我得到了一个空模型:

bert_resnet = BertResNet()

print(bert_resnet)

出: BertResNet()

list(bert_resnet.parameters())还返回[]

1 个答案:

答案 0 :(得分:1)

您从未将模型分配给BertResNet类的对象的任何属性。 __init__方法中包含临时变量,但是一旦完成,这些变量将被丢弃。应该将它们分配给self

def __init__(self):
    super(BertResNet, self).__init__()
    # resnet
    self.resnet50 = models.resnet50(pretrained=True)
    n_inputs = self.resnet50.fc.in_features
    # compressed embedding space
    self.classifier = nn.Sequential(OrderedDict([
        ('fc1', nn.Linear(n_inputs, 512))
    ]))

    self.resnet50.fc = classifier # 512 out resnet 


    self.bert = BertModel.from_pretrained('bert-base-uncased')

    # final classification layer

    self.classification = nn.Linear(512 + 768, 2)