Python torch.nn.utils.rnn.pad_packed_sequence() Examples
The following are 30
code examples of torch.nn.utils.rnn.pad_packed_sequence().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
torch.nn.utils.rnn
, or try the search function
.
Example #1
Source File: model.py From VSE-C with MIT License | 7 votes |
def forward(self, encoding, lengths): lengths = Variable(torch.LongTensor(lengths)) if torch.cuda.is_available(): lengths = lengths.cuda() if self.method == 'mean': encoding_pad = nn.utils.rnn.pack_padded_sequence(encoding, lengths.data.tolist(), batch_first=True) encoding = nn.utils.rnn.pad_packed_sequence(encoding_pad, batch_first=True, padding_value=0)[0] lengths = lengths.float().view(-1, 1) return encoding.sum(1) / lengths, None elif self.method == 'max': return encoding.max(1) # [bsz, in_dim], [bsz, in_dim] (position) elif self.method == 'attn': size = encoding.size() # [bsz, len, in_dim] x_flat = encoding.contiguous().view(-1, size[2]) # [bsz*len, in_dim] hbar = self.tanh(self.ws1(x_flat)) # [bsz*len, attn_hid] alphas = self.ws2(hbar).view(size[0], size[1]) # [bsz, len] alphas = nn.utils.rnn.pack_padded_sequence(alphas, lengths.data.tolist(), batch_first=True) alphas = nn.utils.rnn.pad_packed_sequence(alphas, batch_first=True, padding_value=-1e8)[0] alphas = functional.softmax(alphas, dim=1) # [bsz, len] alphas = alphas.view(size[0], 1, size[1]) # [bsz, 1, len] return torch.bmm(alphas, encoding).squeeze(1), alphas # [bsz, in_dim], [bsz, len] elif self.method == 'last': return torch.cat([encoding[i][lengths[i] - 1] for i in range(encoding.size(0))], dim=0), None
Example #2
Source File: def_to_atts_pretrain.py From verb-attributes with MIT License | 6 votes |
def log_val(word_inds, defns, cost, rank, ranking, num_ex=10): print("mean rank {:.1f}------------------------------------------".format(np.mean(rank))) engl_defns, ls = pad_packed_sequence(defns, batch_first=True, padding_value=0) spacing = np.linspace(len(ls) // num_ex, len(ls), endpoint=False, num=num_ex, dtype=np.int64) engl_defns = [' '.join([val_data.fields['text'].vocab.itos[x] for x in d[1:(l - 1)]]) for d, l in zip(engl_defns.cpu().data.numpy()[spacing], [ls[s] for s in spacing])] top_scorers = [[val_data.fields['label'].vocab.itos[int(x)] for x in t] for t in ranking.data.cpu().numpy()[spacing, :3]] words = [val_data.fields['label'].vocab.itos[int(wi)] for wi in word_inds.cpu().numpy()[spacing]] for w, (word, rank_, top3, l, defn) in enumerate( zip(words, rank, top_scorers, cost, engl_defns)): print("w{:2d}/{:2d}, R{:5d} {:>30} ({:.3f}){:>13}: {}".format( w, 64, rank_, ' '.join(top3), l, word, defn)) print("------------------------------------------------------------")
Example #3
Source File: Models.py From video-caption-openNMT.pytorch with MIT License | 6 votes |
def forward(self, src, lengths=None, encoder_state=None): "See :obj:`EncoderBase.forward()`" self._check_args(src, lengths, encoder_state) emb = self.embeddings(src) s_len, batch, emb_dim = emb.size() packed_emb = emb if lengths is not None and not self.no_pack_padded_seq: # Lengths data is wrapped inside a Variable. lengths = lengths.view(-1).tolist() packed_emb = pack(emb, lengths) memory_bank, encoder_final = self.rnn(packed_emb, encoder_state) if lengths is not None and not self.no_pack_padded_seq: memory_bank = unpack(memory_bank)[0] if self.use_bridge: encoder_final = self._bridge(encoder_final) return encoder_final, memory_bank
Example #4
Source File: model.py From VSE-C with MIT License | 6 votes |
def forward(self, x, lengths): # Embed word ids to vectors x_glove = self.glove.index_select(0, x.view(-1)).view(x.size(0), x.size(1), -1) x_semantic = self.embed(x) x = torch.cat((x_semantic, x_glove), dim=2) packed = pack_padded_sequence(x, lengths, batch_first=True) # Forward propagate RNN out, _ = self.rnn(packed) # Reshape *final* output to (batch_size, hidden_size) padded = pad_packed_sequence(out, batch_first=True, padding_value=-1e8) out = self.combiner(padded[0], lengths)[0] # normalization in the joint embedding space out = l2norm(out) # take absolute value, used by order embeddings if self.use_abs: out = torch.abs(out) return out
Example #5
Source File: seq_ch_conv_lstm.py From attacut with MIT License | 6 votes |
def forward(self, inputs): x, seq_lengths = inputs embedding = self.embeddings(x).permute(0, 2, 1) conv1 = self.conv1(embedding).permute(0, 2, 1) conv2 = self.conv2(embedding).permute(0, 2, 1) out = torch.stack((conv1, conv2), 3) out, _ = torch.max(out, 3) packed_input = pack_padded_sequence( out, seq_lengths.cpu().numpy(), batch_first=True ) packed_output, (ht, ct) = self.lstm(packed_input) out, input_sizes = pad_packed_sequence(packed_output, batch_first=True) out = F.relu(self.linear1(out)) out = self.linear2(out) out = out.view(-1) return out
Example #6
Source File: seq_lstm.py From attacut with MIT License | 6 votes |
def forward(self, inputs): x, seq_lengths = inputs embedding = self.embeddings(x) packed_input = pack_padded_sequence( embedding, seq_lengths.cpu().numpy(), batch_first=True ) packed_output, (ht, ct) = self.lstm(packed_input) output, input_sizes = pad_packed_sequence(packed_output, batch_first=True) out = F.relu(self.linear1(output)) out = self.linear2(out) out = out.view(-1) return out
Example #7
Source File: seq_ch_lstm_conv.py From attacut with MIT License | 6 votes |
def forward(self, inputs): x, seq_lengths = inputs embedding = self.embeddings(x) packed_input = pack_padded_sequence( embedding, seq_lengths.cpu().numpy(), batch_first=True ) packed_output, (ht, ct) = self.lstm(packed_input) output, input_sizes = pad_packed_sequence(packed_output, batch_first=True) output = F.relu(self.conv1(output.permute(0, 2, 1)).permute(0, 2, 1)) out = F.relu(self.linear1(output)) out = self.linear2(out) out = out.view(-1) return out
Example #8
Source File: test_torch_utils.py From molecule-chef with GNU General Public License v3.0 | 6 votes |
def test_prepend_tensor_to_start_of_packed_seq(): padded_seq = torch.tensor([ [[1,2], [3,10], [4,7]], [[8, 9], [10, 6], [11, 18]], [[5,12], [17, 15], [0, 0]] ]) orig_lengths = torch.tensor([3,3,2]) packed_seq = rnn.pack_padded_sequence(padded_seq, orig_lengths, batch_first=True) computed = torch_utils.prepend_tensor_to_start_of_packed_seq(packed_seq, 3) computed_padded_seq, lengths = rnn.pad_packed_sequence(computed, batch_first=True) expected_computed_padded_seq = np.array( [ [[3, 3], [1, 2], [3, 10], [4, 7]], [[3, 3], [8, 9], [10, 6], [11, 18]], [[3, 3], [5, 12], [17, 15], [0, 0]] ]) expected_lengths = np.array([4,4,3]) np.testing.assert_array_equal(expected_computed_padded_seq, computed_padded_seq.numpy()) np.testing.assert_array_equal(expected_lengths, lengths.numpy())
Example #9
Source File: rnn_encoder.py From ITDD with MIT License | 6 votes |
def forward(self, src, lengths=None): "See :obj:`EncoderBase.forward()`" self._check_args(src, lengths) emb = self.embeddings(src) # s_len, batch, emb_dim = emb.size() packed_emb = emb if lengths is not None and not self.no_pack_padded_seq: # Lengths data is wrapped inside a Tensor. lengths_list = lengths.view(-1).tolist() packed_emb = pack(emb, lengths_list) memory_bank, encoder_final = self.rnn(packed_emb) if lengths is not None and not self.no_pack_padded_seq: memory_bank = unpack(memory_bank)[0] if self.use_bridge: encoder_final = self._bridge(encoder_final) return encoder_final, memory_bank, lengths
Example #10
Source File: model.py From SCAN with Apache License 2.0 | 6 votes |
def forward(self, x, lengths): """Handles variable size captions """ # Embed word ids to vectors x = self.embed(x) packed = pack_padded_sequence(x, lengths, batch_first=True) # Forward propagate RNN out, _ = self.rnn(packed) # Reshape *final* output to (batch_size, hidden_size) padded = pad_packed_sequence(out, batch_first=True) cap_emb, cap_len = padded if self.use_bi_gru: cap_emb = (cap_emb[:,:,:cap_emb.size(2)/2] + cap_emb[:,:,cap_emb.size(2)/2:])/2 # normalization in the joint embedding space if not self.no_txtnorm: cap_emb = l2norm(cap_emb, dim=-1) return cap_emb, cap_len
Example #11
Source File: utils.py From OpenKiwi with GNU Affero General Public License v3.0 | 6 votes |
def apply_packed_sequence(rnn, embedding, lengths): """ Runs a forward pass of embeddings through an rnn using packed sequence. Args: rnn: The RNN that that we want to compute a forward pass with. embedding (FloatTensor b x seq x dim): A batch of sequence embeddings. lengths (LongTensor batch): The length of each sequence in the batch. Returns: output: The output of the RNN `rnn` with input `embedding` """ # Sort Batch by sequence length lengths_sorted, permutation = torch.sort(lengths, descending=True) embedding_sorted = embedding[permutation] # Use Packed Sequence embedding_packed = pack(embedding_sorted, lengths_sorted, batch_first=True) outputs_packed, (hidden, cell) = rnn(embedding_packed) outputs_sorted, _ = unpack(outputs_packed, batch_first=True) # Restore original order _, permutation_rev = torch.sort(permutation, descending=False) outputs = outputs_sorted[permutation_rev] hidden, cell = hidden[:, permutation_rev], cell[:, permutation_rev] return outputs, (hidden, cell)
Example #12
Source File: attention_classifier.py From Point-Then-Operate with Apache License 2.0 | 6 votes |
def forward(self, inp, l, null_mask): """ :param inp: shape = (B, T, emb_dim) :param null_mask: shape = (B, T) :return: """ B = inp.shape[0] T = inp.shape[1] inp = inp.transpose(0, 1) # shape = (20, n_batch, emb_dim) packed_emb = pack(inp, l) outputs, h_n = self.Encoder(packed_emb) # h_n.shape = (n_layers * n_dir, n_batch, dim_h) outputs = unpack(outputs, total_length=T)[0] # shape = (20, n_batch, dim_h * n_dir) h_n = h_n.view(self.n_layers, self.n_dir, B, self.dim_h).transpose(1, 2).transpose(2, 3).contiguous().view(self.n_layers, B, -1) # shape = (n_layers, n_batch, dim_h * n_dir) h_n = h_n[-1, :, :] # shape = (n_batch, dim_h * n_dir) context, att_weight = self.Attention(h_n, outputs.transpose(0, 1), null_mask) # (n_batch, dim_h * n_dir), (n_batch, 20) cls = self.MLP(context).squeeze(1) # shape = (n_batch, ) return cls, att_weight
Example #13
Source File: model.py From graph-generation with MIT License | 6 votes |
def forward(self, input_raw, pack=False, input_len=None): if self.has_input: input = self.input(input_raw) input = self.relu(input) else: input = input_raw if pack: input = pack_padded_sequence(input, input_len, batch_first=True) output_raw, self.hidden = self.rnn(input, self.hidden) if pack: output_raw = pad_packed_sequence(output_raw, batch_first=True)[0] if self.has_output: output_raw = self.output(output_raw) # return hidden state at each time step return output_raw # plain GRU model
Example #14
Source File: model.py From graph-generation with MIT License | 6 votes |
def forward(self, input_raw, pack=False, input_len=None): if self.has_input: input = self.input(input_raw) input = self.relu(input) else: input = input_raw if pack: input = pack_padded_sequence(input, input_len, batch_first=True) output_raw, self.hidden = self.rnn(input, self.hidden) if pack: output_raw = pad_packed_sequence(output_raw, batch_first=True)[0] if self.has_output: output_raw = self.output(output_raw) # return hidden state at each time step return output_raw # a deterministic linear output
Example #15
Source File: model.py From graph-generation with MIT License | 6 votes |
def forward(self, input_raw, pack=False,len=None): input = self.linear_input(input_raw) input = self.relu(input) if pack: input = pack_padded_sequence(input, len, batch_first=True) output_raw, self.hidden = self.lstm(input, self.hidden) if pack: output_raw = pad_packed_sequence(output_raw, batch_first=True)[0] output = self.linear_output(output_raw) return output # a simple MLP generator output
Example #16
Source File: Models.py From SEASS with MIT License | 6 votes |
def forward(self, input, hidden=None): """ input: (wrap(srcBatch), wrap(srcBioBatch), lengths) """ lengths = input[-1].data.view(-1).tolist() # lengths data is wrapped inside a Variable wordEmb = self.word_lut(input[0]) emb = pack(wordEmb, lengths) outputs, hidden_t = self.rnn(emb, hidden) if isinstance(input, tuple): outputs = unpack(outputs)[0] forward_last = hidden_t[0] backward_last = hidden_t[1] time_step = outputs.size(0) batch_size = outputs.size(1) sentence_vector = torch.cat((forward_last, backward_last), dim=1) exp_buf = torch.cat((outputs, sentence_vector.unsqueeze(0).expand_as(outputs)), dim=2) selective_value = self.sigmoid(self.selective_gate(exp_buf.view(-1, exp_buf.size(2)))) selective_value = selective_value.view(time_step, batch_size, -1) outputs = outputs * selective_value return hidden_t, outputs
Example #17
Source File: model.py From seq2seq-summarizer with MIT License | 6 votes |
def forward(self, embedded, hidden, input_lengths=None): """ :param embedded: (src seq len, batch size, embed size) :param hidden: (num directions, batch size, encoder hidden size) :param input_lengths: list containing the non-padded length of each sequence in this batch; if set, we use `PackedSequence` to skip the PAD inputs and leave the corresponding encoder states as zeros :return: (src seq len, batch size, hidden size * num directions = decoder hidden size) Perform multi-step encoding. """ if input_lengths is not None: embedded = pack_padded_sequence(embedded, input_lengths) output, hidden = self.gru(embedded, hidden) if input_lengths is not None: output, _ = pad_packed_sequence(output) if self.num_directions > 1: # hidden: (num directions, batch, hidden) => (1, batch, hidden * 2) batch_size = hidden.size(1) hidden = hidden.transpose(0, 1).contiguous().view(1, batch_size, self.hidden_size * self.num_directions) return output, hidden
Example #18
Source File: model.py From reinvent-randomized with MIT License | 6 votes |
def forward(self, padded_seqs, seq_lengths, hidden_state=None): # pylint: disable=W0221 """ Performs a forward pass on the model. Note: you pass the **whole** sequence. :param padded_seqs: Padded input tensor (batch_size, seq_size). :param seq_lengths: Length of each sequence in the batch. :param hidden_state: Hidden state tensor. :return: A tuple with the output state and the output hidden state. """ batch_size = padded_seqs.size(0) if hidden_state is None: size = (self.num_layers, batch_size, self.num_dimensions) hidden_state = [torch.zeros(*size).cuda(), torch.zeros(*size).cuda()] padded_encoded_seqs = self._embedding(padded_seqs) # (batch,seq,embedding) packed_encoded_seqs = tnnur.pack_padded_sequence( padded_encoded_seqs, seq_lengths, batch_first=True, enforce_sorted=False) packed_encoded_seqs, hidden_state = self._rnn(packed_encoded_seqs, hidden_state) padded_encoded_seqs, _ = tnnur.pad_packed_sequence(packed_encoded_seqs, batch_first=True) mask = (padded_encoded_seqs[:, :, 0] != 0).unsqueeze(dim=-1).type(torch.float) logits = self._linear(padded_encoded_seqs)*mask return (logits, hidden_state)
Example #19
Source File: attention_classifier.py From Point-Then-Operate with Apache License 2.0 | 6 votes |
def forward(self, inp, l, null_mask): """ :param inp: shape = (B, T, emb_dim) :param null_mask: shape = (B, T) :return: """ B = inp.shape[0] T = inp.shape[1] inp = inp.transpose(0, 1) # shape = (20, n_batch, emb_dim) packed_emb = pack(inp, l) outputs, h_n = self.Encoder(packed_emb) # h_n.shape = (n_layers * n_dir, n_batch, dim_h) outputs = unpack(outputs, total_length=T)[0] # shape = (20, n_batch, dim_h * n_dir) h_n = h_n.view(self.n_layers, self.n_dir, B, self.dim_h).transpose(1, 2).transpose(2, 3).contiguous().view(self.n_layers, B, -1) # shape = (n_layers, n_batch, dim_h * n_dir) h_n = h_n[-1, :, :] # shape = (n_batch, dim_h * n_dir) context, att_weight = self.Attention(h_n, outputs.transpose(0, 1), null_mask) # (n_batch, dim_h * n_dir), (n_batch, 20) cls = self.MLP(context).squeeze(1) # shape = (n_batch, ) return cls, att_weight
Example #20
Source File: BiLSTM.py From pytorch_NER_BiLSTM_CNN_CRF with Apache License 2.0 | 6 votes |
def forward(self, word, sentence_length): """ :param word: :param sentence_length: :param desorted_indices: :return: """ word, sentence_length, desorted_indices = prepare_pack_padded_sequence(word, sentence_length, device=self.device) x = self.embed(word) # (N,W,D) x = self.dropout_embed(x) packed_embed = pack_padded_sequence(x, sentence_length, batch_first=True) x, _ = self.bilstm(packed_embed) x, _ = pad_packed_sequence(x, batch_first=True) x = x[desorted_indices] x = self.dropout(x) x = torch.tanh(x) logit = self.linear(x) return logit
Example #21
Source File: decoder.py From molecule-chef with GNU General Public License v3.0 | 6 votes |
def nlog_like_of_obs(self, obs: rnn.PackedSequence): """ Here we calculate the negative log likelihood of the sequence. For each we feed in the previous observation ie if you use this function during training then doing teacher forcing. """ # Set up the ground truth inputs from previous time-steps to be fed into the bottom of the RNN symbol_seq_packed_minus_last = torch_utils.remove_last_from_packed_seq(obs) embeddings = self.embedder.forward_on_packed_sequence(symbol_seq_packed_minus_last, stops_pre_filtered_flag=True) inputs = torch_utils.prepend_tensor_to_start_of_packed_seq(embeddings, mchef_config.SOS_TOKEN) # Feed the emebeddings through the network initial_hidden = self._initial_hidden_after_update outputs, _ = self.gru(inputs, initial_hidden) outputs_mapped = self.mlp_out(outputs.data) self.decoder_top.update(outputs_mapped) # Now work out the nll for each element of each sequence and then sum over the whole sequence length. nll_per_obs = self.decoder_top.nlog_like_of_obs(obs.data) nll_packed = rnn.PackedSequence(nll_per_obs, *obs[1:]) nll_padded, _ = rnn.pad_packed_sequence(nll_packed, batch_first=True, padding_value=0.0) nll_per_seq = nll_padded.sum(dim=tuple(range(1, len(nll_padded.shape)))) return nll_per_seq
Example #22
Source File: BiLSTM.py From DocRED with MIT License | 5 votes |
def forward(self, input, input_lengths=None): bsz, slen = input.size(0), input.size(1) output = input outputs = [] if input_lengths is not None: lens = input_lengths.data.cpu().numpy() for i in range(self.nlayers): hidden, c = self.get_init(bsz, i) output = self.dropout(output) if input_lengths is not None: output = rnn.pack_padded_sequence(output, lens, batch_first=True) output, hidden = self.rnns[i](output, (hidden, c)) if input_lengths is not None: output, _ = rnn.pad_packed_sequence(output, batch_first=True) if output.size(1) < slen: # used for parallel padding = Variable(output.data.new(1, 1, 1).zero_()) output = torch.cat([output, padding.expand(output.size(0), slen-output.size(1), output.size(2))], dim=1) if self.return_last: outputs.append(hidden.permute(1, 0, 2).contiguous().view(bsz, -1)) else: outputs.append(output) if self.concat: return torch.cat(outputs, dim=2) return outputs[-1]
Example #23
Source File: BiLSTM.py From DocRED with MIT License | 5 votes |
def forward(self, input, input_lengths=None): bsz, slen = input.size(0), input.size(1) output = input outputs = [] if input_lengths is not None: lens = input_lengths.data.cpu().numpy() for i in range(self.nlayers): hidden = self.get_init(bsz, i) output = self.dropout(output) if input_lengths is not None: output = rnn.pack_padded_sequence(output, lens, batch_first=True) output, hidden = self.rnns[i](output, hidden) if input_lengths is not None: output, _ = rnn.pad_packed_sequence(output, batch_first=True) if output.size(1) < slen: # used for parallel padding = Variable(output.data.new(1, 1, 1).zero_()) output = torch.cat([output, padding.expand(output.size(0), slen-output.size(1), output.size(2))], dim=1) if self.return_last: outputs.append(hidden.permute(1, 0, 2).contiguous().view(bsz, -1)) else: outputs.append(output) if self.concat: return torch.cat(outputs, dim=2) return outputs[-1]
Example #24
Source File: model.py From lightNLP with Apache License 2.0 | 5 votes |
def lstm_forward(self, sentence, poses, rels, sent_lengths): word = self.word_embedding(sentence.to(DEVICE)).to(DEVICE) pos = self.pos_embedding(poses.to(DEVICE)).to(DEVICE) rels = rels.view(rels.size(0), rels.size(1), 1).float().to(DEVICE) x = torch.cat((word, pos, rels), dim=2) x = pack_padded_sequence(x, sent_lengths) self.hidden = self.init_hidden(batch_size=len(sent_lengths)) lstm_out, self.hidden = self.lstm(x, self.hidden) lstm_out, new_batch_size = pad_packed_sequence(lstm_out) assert torch.equal(sent_lengths, new_batch_size.to(DEVICE)) y = self.hidden2label(lstm_out.to(DEVICE)) return y.to(DEVICE)
Example #25
Source File: model.py From lightNLP with Apache License 2.0 | 5 votes |
def lstm_forward(self, sentence, sent_lengths): x = self.embedding(sentence.to(DEVICE)).to(DEVICE) x = pack_padded_sequence(x, sent_lengths) self.hidden = self.init_hidden(batch_size=len(sent_lengths)) lstm_out, self.hidden = self.lstm(x, self.hidden) lstm_out, new_batch_size = pad_packed_sequence(lstm_out) assert torch.equal(sent_lengths, new_batch_size.to(DEVICE)) y = self.hidden2label(lstm_out.to(DEVICE)) return y.to(DEVICE)
Example #26
Source File: model.py From lightNLP with Apache License 2.0 | 5 votes |
def lstm_forward(self, sentence, sent_lengths): x = self.embedding(sentence.to(DEVICE)).to(DEVICE) x = pack_padded_sequence(x, sent_lengths) self.hidden = self.init_hidden(batch_size=len(sent_lengths)) lstm_out, self.hidden = self.lstm(x, self.hidden) lstm_out, new_batch_size = pad_packed_sequence(lstm_out) assert torch.equal(sent_lengths, new_batch_size.to(DEVICE)) y = self.hidden2label(lstm_out.to(DEVICE)) return y.to(DEVICE)
Example #27
Source File: model.py From lightNLP with Apache License 2.0 | 5 votes |
def lstm_forward(self, sentence, sent_lengths): x = self.embedding(sentence.to(DEVICE)).to(DEVICE) x = pack_padded_sequence(x, sent_lengths) self.hidden = self.init_hidden(batch_size=len(sent_lengths)) lstm_out, self.hidden = self.lstm(x, self.hidden) lstm_out, new_batch_size = pad_packed_sequence(lstm_out) assert torch.equal(sent_lengths, new_batch_size.to(DEVICE)) y = self.hidden2label(lstm_out.to(DEVICE)) return y.to(DEVICE)
Example #28
Source File: model.py From lightNLP with Apache License 2.0 | 5 votes |
def forward(self, words, tags): # get the mask and lengths of given batch mask = words.ne(self.pad_index) lens = mask.sum(dim=1) # get outputs from embedding layers embed = self.pretrained_embedding(words) embed += self.word_embedding(words.masked_fill_(words.ge(self.word_embedding.num_embeddings), 0)) tag_embed = self.pos_embedding(tags) embed, tag_embed = self.embed_dropout(embed, tag_embed) # concatenate the word and tag representations x = torch.cat((embed, tag_embed), dim=-1) sorted_lens, indices = torch.sort(lens, descending=True) inverse_indices = indices.argsort() x = pack_padded_sequence(x[indices], sorted_lens, True) x = self.lstm(x) x, _ = pad_packed_sequence(x, True) x = self.lstm_dropout(x)[inverse_indices] # apply MLPs to the LSTM output states arc_h = self.mlp_arc_h(x) arc_d = self.mlp_arc_d(x) rel_h = self.mlp_rel_h(x) rel_d = self.mlp_rel_d(x) # get arc and rel scores from the bilinear attention # [batch_size, seq_len, seq_len] s_arc = self.arc_attn(arc_d, arc_h) # [batch_size, seq_len, seq_len, n_rels] s_rel = self.rel_attn(rel_d, rel_h).permute(0, 2, 3, 1) # set the scores that exceed the length of each sentence to -inf s_arc.masked_fill_((1 - mask).unsqueeze(1), float('-inf')) return s_arc, s_rel
Example #29
Source File: encoder.py From lightNLP with Apache License 2.0 | 5 votes |
def forward(self, sentences, lengths, hidden=None): embedded = self.embed(sentences) packed = pack_padded_sequence(embedded, lengths, batch_first=True) outputs, hidden = self.gru(packed, hidden) outputs, _ = pad_packed_sequence(outputs, batch_first=True) # outputs, hidden = self.gru(embedded, hidden) # sum bidirectional outputs outputs = (outputs[:, :, :self.hidden_size] + outputs[:, :, self.hidden_size:]) return outputs, hidden
Example #30
Source File: ContextAware.py From DocRED with MIT License | 5 votes |
def forward(self, input, input_lengths=None): bsz, slen = input.size(0), input.size(1) output = input outputs = [] if input_lengths is not None: lens = input_lengths.data.cpu().numpy() for i in range(self.nlayers): hidden, c = self.get_init(bsz, i) output = self.dropout(output) if input_lengths is not None: output = rnn.pack_padded_sequence(output, lens, batch_first=True) output, hidden = self.rnns[i](output, (hidden, c)) if input_lengths is not None: output, _ = rnn.pad_packed_sequence(output, batch_first=True) if output.size(1) < slen: # used for parallel padding = Variable(output.data.new(1, 1, 1).zero_()) output = torch.cat([output, padding.expand(output.size(0), slen-output.size(1), output.size(2))], dim=1) if self.return_last: outputs.append(hidden.permute(1, 0, 2).contiguous().view(bsz, -1)) else: outputs.append(output) if self.concat: return torch.cat(outputs, dim=2) return outputs[-1]