Python torch.nn.utils.rnn.pack_padded_sequence() Examples
The following are 30
code examples of torch.nn.utils.rnn.pack_padded_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: modules.py From BAMnet with Apache License 2.0 | 7 votes |
def forward(self, x, x_len, atten_mask): CoAtt = torch.bmm(x, x.transpose(1, 2)) CoAtt = atten_mask.unsqueeze(1) * CoAtt - (1 - atten_mask).unsqueeze(1) * INF CoAtt = torch.softmax(CoAtt, dim=-1) new_x = torch.cat([torch.bmm(CoAtt, x), x], -1) sorted_x_len, indx = torch.sort(x_len, 0, descending=True) new_x = pack_padded_sequence(new_x[indx], sorted_x_len.data.tolist(), batch_first=True) h0 = to_cuda(torch.zeros(2, x_len.size(0), self.hidden_size // 2), self.use_cuda) c0 = to_cuda(torch.zeros(2, x_len.size(0), self.hidden_size // 2), self.use_cuda) packed_h, (packed_h_t, _) = self.model(new_x, (h0, c0)) # restore the sorting _, inverse_indx = torch.sort(indx, 0) packed_h_t = torch.cat([packed_h_t[i] for i in range(packed_h_t.size(0))], -1) restore_packed_h_t = packed_h_t[inverse_indx] output = restore_packed_h_t return output
Example #3
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 #4
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 #5
Source File: model.py From didyprog with MIT License | 6 votes |
def _get_potentials(self, sentences, lengths, letters, letters_lengths, sorted=False): if not sorted: _, indices = torch.sort(lengths, descending=True) _, rev_indices = torch.sort(indices, descending=False) sentences = sentences[indices] lengths = lengths[indices] letters = letters[indices] letters_lengths = letters[indices] else: rev_indices = None embeds = self.embedder(sentences, lengths, letters, letters_lengths) embeds = self.dropout(embeds) proc = self.processor(embeds, lengths, sorted=True) potential = self.linear_potential(proc) potential = pack_padded_sequence(potential, lengths, batch_first=True) return potential, rev_indices
Example #6
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 #7
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 #8
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 #9
Source File: enc_lstm.py From vae-lagging-encoder with MIT License | 6 votes |
def forward(self, input): """ Args: input: tuple which contains x and sents_len x: (batch_size, seq_len) sents_len: long tensor of sentence lengths Returns: Tensor1, Tensor2 Tensor1: the mean tensor, shape (batch, nz) Tensor2: the logvar tensor, shape (batch, nz) """ input, sents_len = input # (batch_size, seq_len, args.ni) word_embed = self.embed(input) packed_embed = pack_padded_sequence(word_embed, sents_len.tolist(), batch_first=True) _, (last_state, last_cell) = self.lstm(packed_embed) mean, logvar = self.linear(last_state).chunk(2, -1) return mean.squeeze(0), logvar.squeeze(0)
Example #10
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 #11
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 #12
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 #13
Source File: bucket_iterator.py From verb-attributes with MIT License | 6 votes |
def _defns_to_packed_seq(defns, field, cuda=torch.cuda.is_available(), volatile=False): """ Pads a list of definitions (in sorted order!) :param tokenized_defns: List of lists containing tokenized definitions OR List of string containind definitions :param field: Contains padding and vocab functions. :param cuda: if true, we'll cudaize it :param volatile: :return: PackedSequence with a Variable. """ tokenized_defns = [field.preprocess(x) for x in defns] defns_padded, lengths = field.pad(tokenized_defns) if not all(lengths[i] >= lengths[i + 1] for i in range(len(lengths) - 1)): raise ValueError("Sequences must be in decreasing order") defns_tensor = torch.LongTensor([ [field.vocab.stoi[x] for x in ex] for ex in defns_padded ]) defns_packed_ = pack_padded_sequence(defns_tensor, lengths, batch_first=True) packed_data = Variable(defns_packed_.data, volatile=volatile) if cuda: packed_data = packed_data.cuda() return PackedSequence(packed_data, defns_packed_.batch_sizes)
Example #14
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 #15
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 #16
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 #17
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 #18
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 #19
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 #20
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 #21
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 #22
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 #23
Source File: encoder.py From training_results_v0.5 with Apache License 2.0 | 5 votes |
def bidir_lstm(model, input, lengths): packed_input = pack_padded_sequence(input, lengths.cpu().numpy()) out = model(packed_input)[0] return pad_packed_sequence(out)[0]
Example #24
Source File: Models.py From NQG with GNU General Public License v3.0 | 5 votes |
def forward(self, input, bio, feats, 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]) bioEmb = self.bio_lut(bio[0]) featsEmb = [self.feat_lut(feat) for feat in feats[0]] featsEmb = torch.cat(featsEmb, dim=-1) input_emb = torch.cat((wordEmb, bioEmb, featsEmb), dim=-1) emb = pack(input_emb, lengths) outputs, hidden_t = self.rnn(emb, hidden) if isinstance(input, tuple): outputs = unpack(outputs)[0] return hidden_t, outputs
Example #25
Source File: LSTM.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 #26
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 #27
Source File: LSTM_SP.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 #28
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 = 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 #29
Source File: encoder.py From training_results_v0.5 with Apache License 2.0 | 5 votes |
def forward(self, inputs, lengths): """ Execute the encoder. :param inputs: tensor with indices from the vocabulary :param lengths: vector with sequence lengths (excluding padding) returns: tensor with encoded sequences """ x = self.embedder(inputs) # bidirectional layer # x = pack_padded_sequence(x, lengths.cpu().numpy(), # batch_first=self.batch_first) # x, _ = self.rnn_layers[0](x) x = self.rnn_layers[0](x, lengths.cpu().long()) # x, _ = pad_packed_sequence(x, batch_first=self.batch_first) # 1st unidirectional layer x = self.dropout(x) x, _ = self.rnn_layers[1](x) # the rest of unidirectional layers, # with residual connections starting from 3rd layer for i in range(2, len(self.rnn_layers)): residual = x x = self.dropout(x) x, _ = self.rnn_layers[i](x) x = x + residual return x
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]