Hello,
I created this model to adapt both GRU and bidrectional GRU, would it be the correct way? Because I don’t understand Bidirectional GRU completely…
Here are the snippets where I change according to if it is bidirectional or not:
class MySpeechRecognition(nn.Module):
    """
    The RNN model that will be used to perform Sentiment analysis.
    """

    def __init__(self, input_size, output_size, hidden_dim, n_layers, n_feats, drop_prob=0.5, bidir=False):
        super(MySpeechRecognition, self).__init__()
        #output_dim = will be the alphabet + '' and space = 28 chars
        self.input_size = input_size
        self.hidden_dim = hidden_dim
        self.n_layers = n_layers
        self.drop_prob = drop_prob
        self.output_dim = output_size
        self.bidir = bidir
        

        # GRU Layer --> input (batch, channel*features, time)
        # Input size = number of features
        self.gru = nn.GRU(input_size, hidden_dim, n_layers, batch_first=True, dropout=drop_prob, bidirectional=bidir)
        # shape output (batch, channel*features, time * hidden_size)
        self.layer_norm = nn.LayerNorm(n_feats)
        # (batch, channel, features, time)
        #Fully Connected 
        **if self.bidir:**
**            self.fc1 = nn.Linear(self.hidden_dim*2,512)**
**        else:**
**            self.fc1 = nn.Linear(self.hidden_dim,512)**
        self.fc2 = nn.Linear(512, self.output_dim)
        self.dropout = nn.Dropout(0.2)

        
    def forward(self, x, hidden):
       # Forward function is same for both!
        
    
    def init_hidden(self, batch_size):
        ''' Initializes hidden state '''
        # Create two new tensors with sizes n_layers x batch_size x hidden_dim,
        # initialized to zero, for hidden state and cell state of LSTM
        weight = next(self.parameters()).data
        **if (self.bidir):**
**            self.n_layers = self.n_layers*2**
            
        if (train_on_gpu):
            hidden = (weight.new(self.n_layers, batch_size, self.hidden_dim).zero_()).cuda()
        else:
            hidden = (weight.new(self.n_layers, batch_size, self.hidden_dim).zero_())
        
        return hidden

Additionally to that question, if I have a tensor of (32, 1, 128, 250) [It is melspectrogram], which I understand is --> [Batch, Channel, Height, Width]. In this case, which would be the x0, x1, x2 (shown in picture)  in the GRU? The Height or the Width?
lstm-output-vs-hidden640×548 20.9 KB