当前位置:   article > 正文

BERT+textcnn代码及报错解决_calculated padded input size per channel:(11 脳 11)

calculated padded input size per channel:(11 脳 11). kernel size:(21 脳 21)

报错时检查维度

过程中报过2个主要错误

第一个expected input [1,32,768] to have 1 channel, but got 32 channels instead.

第二个calculated padded input size per channel: (1*768)...kernel size can't be greater than actaual input size.

但是实际上是textcnn输入维度的错误

这里模型的第4行,输出是有两个,两个的维度不同。对于textCNN来说,输入的维度是3维,如前者。对于LSTM来说,输入是后者

# encoder_out:[batch_size,seq_len,hidden_size],text_cls:[batch_size,hidden_size]

  1. def forward(self, x): # x:{[batch_size,seq_len],[batch_size,],[batch_size,seq_len]}
  2. context = x[0] # context:[batch_size,seq_len],输入的句子
  3. mask = x[2] # mask:[bacth_size,seq_len],对padding部分进行mask
  4. encoder_out, text_cls = self.bert(context, attention_mask=mask, output_all_encoded_layers=False) # encoder_out:[batch_size,seq_len,hidden_size],text_cls:[batch_size,hidden_size]
  5. out = encoder_out.unsqueeze(1) # out:[batch_size,1,seq_len,hidden_size]
  6. out = torch.cat([self.conv_and_pool(out, conv) for conv in self.convs], 1) # out:[batch_size,num_filters * len(filter_sizes)]
  7. out = self.dropout(out)
  8. out = self.fc_cnn(out) # out:[batch_size,num_class]
  9. return out

这部分代码

作者:影子
链接:https://www.zhihu.com/question/477075127/answer/2731541347
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

可运行代码

  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as F
  4. class TextCNNBert(nn.Module):
  5. def __init__(self, vocab_size, embedding_size, num_classes):
  6. super(TextCNNBert, self).__init__()
  7. self.filter_sizes = [2, 3, 4]
  8. num_filter = 2
  9. self.num_filters_total = num_filter * len(self.filter_sizes)
  10. # 卷积核打包
  11. self.filter_list = nn.ModuleList(
  12. [nn.Conv2d(1, num_filter, (size, 768)) for size in self.filter_sizes])
  13. self.dropout = nn.Dropout(0.5)
  14. self.fc = nn.Linear(num_filter * len(self.filter_sizes), num_classes) #
  15. def forward(self, x):
  16. x = x.float()
  17. x = x.unsqueeze(1) # ( 输入,输出 )
  18. pooled_outputs = []
  19. # 卷积运算
  20. for i, conv in enumerate(self.filter_list):
  21. conv_feature = F.relu(conv(x)) # 得到卷积后的特征
  22. # 定义池化层
  23. maxp = nn.MaxPool2d((x.shape[2] - self.filter_sizes[i] + 1, 1)) # 其中x.shape[1]代表句子的长度,
  24. # self.filter_sizes[i]代表卷积核的宽度,1代表词语嵌入的维度
  25. pooled = maxp(conv_feature).permute(0, 3, 2, 1) # 在进行最大池化之后,得到的张量是四维的,
  26. # 包括了样本数、通道数、池化后的高度和宽度。而在这里,作者想要将高度和宽度的维度交换,
  27. # 即从(样本数、通道数、高度、宽度)变为(样本数、宽度、高度、通道数)的形式。
  28. # 这是为了后续的拼接操作,将不同窗口大小的池化结果按通道方向拼接,方便进行全连接层的处理。
  29. pooled_outputs.append(pooled)
  30. # 池化层的拼接
  31. feature = torch.cat(pooled_outputs, len(self.filter_sizes)) # 在第3个维度上拼接起来,即在不同卷积核尺寸的特征图之间进行拼接。
  32. # 改变尺寸
  33. feature = torch.reshape(feature, [-1, self.num_filters_total])
  34. # dropout
  35. feature = self.dropout(feature)
  36. outs = self.fc(feature)
  37. return outs

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/342477
推荐阅读
相关标签
  

闽ICP备14008679号