bert 到 cnn 模型的输出

output from bert into cnn model

我正在尝试使用 pytorch 将 bert 模型与 Cnn 1d 连接起来。我使用了这段代码,但我不明白函数 conv1d 中 in_channels 和 out_channels 的含义 如果 cnn 模型的输入形状是 torch(256,64,768)

class MixModel(nn.Module):
    def __init__(self,pre_trained='distilbert-base-uncased'):
        super().__init__()        
        self.bert =  AutoModel.from_pretrained('distilbert-base-uncased')
        self.hidden_size = self.bert.config.hidden_size
        self.conv = nn.Conv1d(in_channels=1, out_channels=256, kernel_size=5, padding='valid', stride=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool1d(kernel_size= 256- 5 + 1)
        self.dropout = nn.Dropout(0.3)
        self.clf = nn.Linear(self.hidden_size*2,6)
        
      
           
    def forward(self,inputs, mask , labels):
        
        cls_hs = self.bert(input_ids=inputs,attention_mask=mask, return_dict= False) 
        x=cls_hs
       # x = torch.cat(cls_hs[0]) # x= [416, 64, 768]
        x = self.conv(x)
        x = self.relu(x)
        x = self.pool(x)
        x = self.dropout(x)
        x = self.clf(x)
        
        
      
        return x

编辑 我使用推荐的答案并更改参数但出现错误

class MixModel(nn.Module):
    def __init__(self,pre_trained='bert-base-uncased'):
        super().__init__()        
        self.bert =  AutoModel.from_pretrained('distilbert-base-uncased')
        self.hidden_size = self.bert.config.hidden_size
        self.conv = nn.Conv1d(in_channels=768, out_channels=256, kernel_size=5, padding='valid', stride=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool1d(kernel_size= 64- 5 + 1)
        print(11)
        self.dropout = nn.Dropout(0.3)
        print(12)
        self.clf = nn.Linear(self.hidden_size*2,6)
        print(13)
        
      
           
    def forward(self,inputs, mask , labels):
        
        cls_hs = self.bert(input_ids=inputs,attention_mask=mask, return_dict= False) 
        x=cls_hs[0]
        print(cls_hs[0]) 
        print(len(cls_hs[0]))
        print(cls_hs[0].size())
        #x = torch.cat(cls_hs,0) # x= [416, 64, 768]
        x = x.permute(0, 2, 1)
        x = self.conv(x)
        x = self.relu(x)
        x = self.pool(x)
        x = self.dropout(x)
        x = self.clf(x)
return x

错误是 5帧 /usr/local/lib/python3.7/dist-packages/torch/nn/functional.py 线性(输入、权重、偏差) 攀上漂亮女局长之后1846 1847 return handle_torch_function(线性,(输入,权重,偏差),输入,权重,偏差=偏差) -> 1848 return torch._C._nn.linear(输入、权重、偏差) 1849年 1850

运行时错误:mat1 和 mat2 形状不能相乘(65536x1 和 1536x6)


BERT(以及许多其他 transformer-based 模型)的输出预测维度的形状为 batchxseq-lenxfeature-dim:即您的输入是一批 256 个长度为 64 个标记的序列(可能带有填充),每个标记由一个 768 维的特征向量表示。

为了沿 sequence-len 维度应用一维卷积,您首先需要 permute x 的形状为 batchxdimxlen:

x = x.permute(0, 2, 1)

现在您可以应用 nn.Conv1d,其中 in_channelsx = 768 的维度。 out_channels 由您决定 - 模型的隐藏维度是什么。