I am trying to make a custom CNN architecture using Pytorch. The current architecture is for text multilabel classification but I want to add some information, say the category of the text to the classification, the category can be a one-hot vector or something like that.
class CNN(nn.Module):
"""
Convolutional Neural Model used for training the models. The total number of kernels that will be used in this
CNN is Co * len(Ks).
Args:
weights_matrix: numpy.ndarray, the shape of this n-dimensional array must be (words, dims) were words is
the number of words in the vocabulary and dims is the dimensionality of the word embeddings.
Co (number of filters): integer, stands for channels out and it is the number of kernels of the same size that will be used.
Hu: integer, stands for number of hidden units in the hidden layer.
C: integer, number of units in the last layer (number of classes)
Ks: list, list of integers specifying the size of the kernels to be used.
"""
def __init__(self, vocab_size, emb_dim, Co, Hu, C, Ks, name = 'generic'):
super(CNN, self).__init__()
self.num_embeddings = vocab_size
self.embeddings_dim = emb_dim
self.padding_index = 0
self.cnn_name = 'cnn_' + str(emb_dim) + '_' + str(Co) + '_' + str(Hu) + '_' + str(C) + '_' + str(Ks) + '_' + name
self.Co = Co
self.Hu = Hu
self.C = C
self.Ks = Ks
self.embedding = nn.Embedding(self.num_embeddings, self.embeddings_dim, self.padding_index)
self.convolutions = nn.ModuleList([nn.Conv2d(1,self.Co,(k, self.embeddings_dim)) for k in self.Ks])
self.relu = nn.ReLU()
self.drop_out = nn.Dropout(p=0.5)
units = [self.Co * len(self.Ks)] + Hu
self.linear_layers = nn.ModuleList([nn.Linear(units[k],units[k+1]) for k in range(len(units)-1)])
self.linear_last = nn.Linear(self.Hu[-1], self.C)
self.sigmoid = nn.Sigmoid()
def forward(self,x):
x = self.embedding(x)
x = [self.relu(conv(x)).squeeze(3) for conv in self.convolutions]
x = [F.max_pool1d(i, i.size(2)).squeeze(2) for i in x]
x = torch.cat(x,1)
x = linear(x)
x = self.relu(x)
x = self.drop_out(x)
x = self.linear_last(x)
x = self.sigmoid(x)
return x
I want to add a Linear layer that has ass input a one-hot vector and connect this layer to my neural network (concatenate the output of CNN with new layers) and AFAIK PyTorch does the backpropagation by itself.
I am new to Pytorch so if you can help me with what modifications I should add to the code or point me to any direction that can be useful. Thanks