Hey all,
I am trying to implement a fully connected multilayer RNN using torch.nn.RNNCell
.
I have implemented it, but it looks like it is not working.
Here is the code for reference:
class MultilayerRNN(nn.Module):
def __init__(self, input_size, output_size, hidden_layers = [100, 100, 100]):
super(NormalDeepRNN, self).__init__()
assert len(hidden_layers) > 0
self.hidden_layers = hidden_layers
self.num_layers = len(hidden_layers)
self.input_size = input_size
self.embedding = nn.Embedding(self.input_size, self.hidden_layers[0])
self.layer_out = nn.Linear(hidden_layers[-1], num_classes)
def forward(self, input):
# input.shape: [BATCH_SIZE, INPUT_SIZE], e.g. [16, 128]
# After trnaspose,
# input.shape: [INPUT_SIZE, BATCH_SIZE], e.g. [128, 16]
input = input.t()
# After embedding,
# input.shape: [INPUT_SIZE, BATCH_SIZE, EMBEDDING_DIM], e.g. [128, 16, 100]
input = self.embedding(input)
for i, out_size in enumerate(self.hidden_layers):
if i == 0:
# For first hidden layer, input_size == embedding_dim
in_size = input.size(2)
else:
in_size = self.hidden_layers[i-1]
rnn = nn.RNNCell(in_size, out_size, 'tanh')
hx = self.__init_hidden(input.size(1), in_size)
input = self.__cell(rnn, input, hx)
output = self.layer_out(input[-1])
return output, input[-1]
def __cell(self, cell, input, hx):
inputs = input.unbind(0)
outputs= []
for i in range(len(inputs)):
hx = cell(inputs[i], hx)
outputs += [hx]
return torch.stack(outputs)
def __init_hidden(self, batch_size, hidden_size):
hidden = torch.zeros(batch_size, hidden_size)
return Variable(hidden)
It always gives accuracy around 50%, which is baseline considering I am trying binary classification.
The same dataset gives around 85% accuracy with standard RNN modules (e.g. nn.RNNBase
or nn.RNN
).
I am pretty sure there is something wrong with my forward
method, but I am unable to point it out.
Any help is appreciated.
Thank you.
Best,
Harshil