Implementing inference functions

This commit is contained in:
andrea 2021-01-22 16:54:56 +01:00
parent 4d3ef41a07
commit 9af9347531
2 changed files with 29 additions and 25 deletions

View File

@ -110,33 +110,37 @@ class RecurrentModel(pl.LightningModule):
def encode(self, lX, l_pad, batch_size=128): def encode(self, lX, l_pad, batch_size=128):
""" """
Returns encoded data (i.e, RNN hidden state at second feed-forward layer - linear1). Dimensionality is 512. Returns encoded data (i.e, RNN hidden state at second feed-forward layer - linear1). Dimensionality is 512.
# TODO: does not run on gpu..
:param lX: :param lX:
:param l_pad:
:param batch_size:
:return: :return:
""" """
l_embed = {lang: [] for lang in lX.keys()} with torch.no_grad():
for lang in sorted(lX.keys()): l_embed = {lang: [] for lang in lX.keys()}
for i in range(0, len(lX[lang]), batch_size): for lang in sorted(lX.keys()):
if i+batch_size > len(lX[lang]): for i in range(0, len(lX[lang]), batch_size):
batch = lX[lang][i:len(lX[lang])] if i+batch_size > len(lX[lang]):
else: batch = lX[lang][i:len(lX[lang])]
batch = lX[lang][i:i+batch_size] else:
max_pad_len = define_pad_length(batch) batch = lX[lang][i:i+batch_size]
batch = pad(batch, pad_index=l_pad[lang], max_pad_length=max_pad_len) max_pad_len = define_pad_length(batch)
X = torch.LongTensor(batch) batch = pad(batch, pad_index=l_pad[lang], max_pad_length=max_pad_len)
_batch_size = X.shape[0] X = torch.LongTensor(batch)
X = self.embed(X, lang) _batch_size = X.shape[0]
X = self.embedding_dropout(X, drop_range=self.drop_embedding_range, p_drop=self.drop_embedding_prop, X = self.embed(X, lang)
training=self.training) X = self.embedding_dropout(X, drop_range=self.drop_embedding_range, p_drop=self.drop_embedding_prop,
X = X.permute(1, 0, 2) training=self.training)
h_0 = Variable(torch.zeros(self.n_layers * self.n_directions, _batch_size, self.hidden_size).to(self.device)) X = X.permute(1, 0, 2)
output, _ = self.rnn(X, h_0) h_0 = Variable(torch.zeros(self.n_layers * self.n_directions, _batch_size, self.hidden_size).to(self.device))
output = output[-1, :, :] output, _ = self.rnn(X, h_0)
output = F.relu(self.linear0(output)) output = output[-1, :, :]
output = self.dropout(F.relu(self.linear1(output))) output = F.relu(self.linear0(output))
l_embed[lang].append(output) output = self.dropout(F.relu(self.linear1(output)))
for k, v in l_embed.items(): l_embed[lang].append(output)
l_embed[k] = torch.cat(v, dim=0) for k, v in l_embed.items():
return l_embed l_embed[k] = torch.cat(v, dim=0).cpu().numpy()
return l_embed
def training_step(self, train_batch, batch_idx): def training_step(self, train_batch, batch_idx):
lX, ly = train_batch lX, ly = train_batch

View File

@ -229,7 +229,7 @@ class RecurrentGen(ViewGen):
l_pad = self.multilingualIndex.l_pad() l_pad = self.multilingualIndex.l_pad()
data = self.multilingualIndex.l_devel_index() data = self.multilingualIndex.l_devel_index()
# trainer = Trainer(gpus=self.gpus) # trainer = Trainer(gpus=self.gpus)
# self.model.eval() self.model.eval()
time_init = time() time_init = time()
l_embeds = self.model.encode(data, l_pad, batch_size=256) l_embeds = self.model.encode(data, l_pad, batch_size=256)
transform_time = round(time() - time_init, 3) transform_time = round(time() - time_init, 3)