Hi,
I am trying to build a model that can both handel string and float values.
My plan is to turn the strings, character wise in to a one hot encoded tensors which then could be fed to a RNN. Afterwards that result would be merged with the other float values in a regular linear network.
But I seem to be getting a bit confused on how to implement it correctly.
Looking forward to your advice.
This is what I have so far:
class NeuralNet(nn.Module):
def __init__(self, input_size_int, input_size_str, hidden_size_rnn, hidden_size_ln):
super(NeuralNet, self).__init__()
self.num_layers = 5
self.hidden_size_rnn =hidden_size_rnn
self.rnns = nn.ModuleList()
self.fully_connected = nn.ModuleList()
self.h = []
for i in range(input_size_str):
self.rnns.append(nn.RNN(input_size=len(str_m.ALL_LETTERS) ,hidden_size=hidden_size_rnn, num_layers=self.num_layers, batch_first=True))
self.fully_connected.append(nn.Linear(hidden_size_rnn, 1))
self.input_size = input_size_int + input_size_str
self.l1 = nn.Linear(input_size_int + input_size_str, hidden_size_ln)
self.l2 = nn.Linear(hidden_size_ln, 2)
def forward(self, x1, s):
self.hidden = [None for _ in range(len(self.rnns))]
x2 = []
for idx, rnn in enumerate(self.rnns):
self.hidden[idx] = torch.zeros(self.num_layers, s[idx].size()[0], self.hidden_size_rnn).to(device)
out_rnn, _ = rnn(s[idx],self.hidden[idx])
# out: batch_size, seq_legnth, hidden_size
out_rnn = out_rnn[-1::]
out_rnn = self.fully_connected[idx](out_rnn)
x2.append(out_rnn.reshape(-1))
# Merge X1 and X2
x = torch.cat([x1, torch.cat(x2)])
out = F.relu(self.l1(x))
out = F.relu(self.l2(out))
return out