1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| import torch.nn as nn import torch.nn.functional as F class CNN(nn.Module): def __init__(self): super(CNN,self).__init__() self.embedding_choice=embedding_choice if self.embedding_choice== 'rand': self.embedding=nn.Embedding(num_embeddings,embedding_dim) if self.embedding_choice== 'glove': self.embedding = nn.Embedding(num_embeddings, embedding_dim, padding_idx=PAD_INDEX).from_pretrained(TEXT.vocab.vectors, freeze=True) self.conv1 = nn.Conv2d(in_channels=1,out_channels=filters_num , kernel_size=(3, embedding_dim), padding=(2,0)) self.conv2 = nn.Conv2d(in_channels=1,out_channels=filters_num , kernel_size=(4, embedding_dim), padding=(3,0)) self.conv3 = nn.Conv2d(in_channels=1,out_channels=filters_num , kernel_size=(5, embedding_dim), padding=(4,0)) self.dropout = nn.Dropout(dropout_p) self.fc = nn.Linear(filters_num * 3, label_num) def forward(self,x): x=self.embedding(x).unsqueeze(1) x1 = F.relu(self.conv1(x)).squeeze(3) x1 = F.max_pool1d(x1, x1.size(2)).squeeze(2) x2 = F.relu(self.conv2(x)).squeeze(3) x2 = F.max_pool1d(x2, x2.size(2)).squeeze(2) x3 = F.relu(self.conv3(x)).squeeze(3) x3 = F.max_pool1d(x3, x3.size(2)).squeeze(2) x = torch.cat((x1, x2, x3), dim=1) x = self.dropout(x) out = self.fc(x) return out
|