[Help] Customize CNN pytorch

Kognate: <p>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.</p>
<pre><code class="lang-auto">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
</code></pre>
<p>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.</p>
<p>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</p>

Topsoil: <p>Process input image through convolutions however you like, after last convolution insert nn.Flatten (or use any other method of converting tensors from shape (batch,channels,height,width) to shape (batch,data)), then torch.cat it with a features vector and pass it into final linear layer, or a couple of them</p>

Kognate: <p>Thank you for taking the time to reply <a class="mention" href="/u/topsoil">@Topsoil</a>.</p>
<p>My problem is actually a text classification problem and I want to add the category of that text as an additional input to my cnn to help it remember from which parent category the text is coming. I thought of adding one hot vector that has all the categories but I’m just getting started with pytorch so I dont know how to do that code wise.</p>