LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
stanza_models_depparse_model.h
Go to the documentation of this file.
1// Copyright 2022 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
6#ifndef DEEPLIMA_LIBS_NN_STANZA_MODELS_DEPPARSE_MODEL_H
7#define DEEPLIMA_LIBS_NN_STANZA_MODELS_DEPPARSE_MODEL_H
8
9#include <torch/torch.h>
10#include <torch/nn/modules/dropout.h>
11#include <torch/nn/modules/embedding.h>
12#include <torch/nn/modules/linear.h>
13#include <torch/nn/modules/rnn.h>
14#include <torch/nn/utils/rnn.h>
15#include <ATen/ATen.h>
16#include <ATen/Functions.h>
17
18#include <algorithm>
19
20namespace deeplima
21{
22namespace nets
23{
24namespace torch_modules
25{
26
30class WordDropoutImpl: torch::nn::Module
31{
32public:
33 WordDropoutImpl() = default;
35 torch::nn::Module(),
37 {
38 }
39
40 torch::Tensor forward(torch::Tensor x, torch::Tensor replacement=torch::Tensor())
41 {
42 if (!is_training() || dropprob == 0)
43 return x;
44
45 auto masksize = std::vector<int64_t>(x.numel());
46 for (int64_t y = 0; y < x.numel(); y++) masksize[y] = y;
47 masksize[-1] = 1;
48 // TODO put to correct device
49 auto dropmask = torch::rand(masksize) < dropprob;
50
51 auto res = x.masked_fill(dropmask, 0);
52 if (replacement.numel() == 0)
53 res = res + dropmask.to(torch::kFloat) * replacement;
54
55 return res;
56 }
57
58 std::string extra_repr()
59 {
60 return std::string("p=") + std::to_string(dropprob);
61 }
62
63 int64_t dropprob;
64};
65TORCH_MODULE(WordDropout);
66
68class LSTMwRecDropoutImpl: public torch::nn::Module
69{
70public:
72 LSTMwRecDropoutImpl(int64_t input_size, int64_t hidden_size, int64_t num_layers, bool bias=true,
73 bool batch_first=false, float dropout=0, bool bidirectional=false,
74 bool pad=false, float rec_dropout=0):
75 torch::nn::Module(),
77 pad(pad),
81 drop(torch::nn::DropoutOptions().p(dropout).inplace(true)),
82 rec_drop(torch::nn::DropoutOptions().p(rec_dropout).inplace(true)),
83 num_directions(bidirectional ? 2 : 1),
84 cells()
85 {
86 for (int64_t l = 0; l < num_layers; l++)
87 {
88 auto in_size = l == 0 ? input_size : num_directions * hidden_size;
89 for (int64_t d = 0; d < num_directions; d++)
90 cells->push_back(torch::nn::LSTMCell(torch::nn::LSTMCellOptions(in_size, hidden_size).bias(bias)));
91 }
92 }
93
96 std::pair<torch::Tensor, std::pair<torch::Tensor, torch::Tensor>> rnn_loop(torch::Tensor x,
97 torch::Tensor batch_sizes,
98 torch::nn::LSTMCellImpl* cell,
99 std::vector<torch::Tensor> inits,
100 bool reverse=false)
101 {
102 auto batch_size = batch_sizes[0].item();
103 std::vector<std::vector<torch::Tensor>> states;
104 for (auto init: inits)
105 {
106 auto l = init.split(std::vector<int64_t>(batch_size.to<int64_t>(), 1));
107 states.push_back(l);
108 }
109 auto h_drop_mask = x.new_ones({batch_size.to<int64_t>(), hidden_size});
110 h_drop_mask = rec_drop(h_drop_mask);
111 std::vector<torch::Tensor> resh;
112
113 if (!reverse)
114 {
115 int64_t st = 0;
116 for (int i = 0; i < batch_sizes.numel(); i++)
117 {
118 auto bs = *(batch_sizes.data_ptr<int64_t>()+i);
119 // states[0][:bs],
120 // TODO use C++20 ranges instead of temporary slice0 and slice1 vectors with copies
121 std::vector<torch::Tensor> slice0, slice1;
122 for (int64_t p = 0; p < bs; p++)
123 {
124 slice0.push_back(states[0][p]);
125 slice1.push_back(states[1][p]);
126 }
127 auto s1 = cell->forward(x.index({torch::indexing::Slice(st, st+bs)}),
128 std::make_tuple(
129 torch::cat(slice0, 0) * h_drop_mask.index({torch::indexing::Slice(0, bs)}),
130 torch::cat(slice1, 0)
131 ));
132 resh.push_back(std::get<0>(s1));
133 for (int64_t j = 0; j < bs; j++)
134 {
135 states[0][j] = std::get<0>(s1).index({j}).unsqueeze(0);
136 states[1][j] = std::get<1>(s1).index({j}).unsqueeze(0);
137 }
138 st += bs;
139 }
140 }
141 else
142 {
143 auto en = x.size(0);
144 for (int64_t i = batch_sizes.size(0)-1; i > 0; i--)
145 {
146 auto bs = *(batch_sizes.data_ptr<int64_t>()+i);
147 // TODO use C++20 ranges instead of temporary slice0 and slice1 vectors with copies
148 std::vector<torch::Tensor> slice0, slice1;
149 for (int64_t p = 0; p < bs; p++)
150 {
151 slice0.push_back(states[0][p]);
152 slice1.push_back(states[1][p]);
153 }
154 auto s1 = cell->forward(x.index({torch::indexing::Slice(en-bs, en)}),
155 std::make_tuple<torch::Tensor, torch::Tensor>(
156 torch::cat(slice0, 0) * h_drop_mask.index({torch::indexing::Slice(0, bs)}),
157 torch::cat(slice1, 0)));
158 resh.push_back(std::get<0>(s1));
159 for (int64_t j = 0; j < bs; j++)
160 {
161 states[0][j] = std::get<0>(s1).index({j}).unsqueeze(0);
162 states[1][j] = std::get<1>(s1).index({j}).unsqueeze(0);
163 }
164 en -= bs;
165 }
166 std::reverse(resh.begin(), resh.end());
167 }
168
169 return std::make_pair(torch::cat(resh, 0), std::make_pair(torch::cat(states[0], 0), torch::cat(states[0], 0)));
170 }
171
172 std::tuple<torch::nn::utils::rnn::PackedSequence, std::tuple<torch::Tensor, torch::Tensor>> forward(
173 torch::nn::utils::rnn::PackedSequence input,
174 torch::optional<std::tuple<torch::Tensor, torch::Tensor>> hx = {})
175 {
176 std::pair<std::vector<torch::Tensor>, std::vector<torch::Tensor>> all_states;
177 auto inputdata = input.data();
178 auto batch_sizes = input.batch_sizes();
179 for (int64_t l = 0; l < num_layers; l++)
180 {
181 std::vector<torch::Tensor> new_input;
182
183 if (dropout > 0 && l > 0)
184 inputdata = drop(inputdata);
185 for (int64_t d = 0; d < num_directions; d++)
186 {
187 auto idx = l * num_directions + d;
188 auto cell = cells[idx]->as<torch::nn::LSTMCell>();
189 // x.new_ones({batch_size.to<int64_t>(), hidden_size})
190 std::vector<torch::Tensor> inits;
191 if (hx)
192 inits = {std::get<0>(*hx).index({idx}), std::get<1>(*hx).index({idx})};
193 else
194 inits = {
195 input.data().new_zeros({input.batch_sizes().index({0}).item().to<int64_t>(), hidden_size},
196 torch::TensorOptions().requires_grad(false)),
197 input.data().new_zeros({input.batch_sizes().index({0}).item().to<int64_t>(), hidden_size},
198 torch::TensorOptions().requires_grad(false))
199 };
200 auto loop_result = rnn_loop(inputdata, batch_sizes, cell, inits, (d == 1));
201 auto out = std::get<0>(loop_result);
202 auto states = std::get<1>(loop_result);
203 new_input.push_back(out);
204 std::get<0>(all_states).push_back(std::get<0>(states).unsqueeze(0));
205 std::get<1>(all_states).push_back(std::get<1>(states).unsqueeze(0));
206 }
207 if (num_directions > 1)
208 // # concatenate both directions
209 inputdata = torch::cat(new_input, 1);
210 else
211 inputdata = new_input[0];
212 }
213 input = torch::nn::utils::rnn::PackedSequence(inputdata, batch_sizes);
214
215 return {input, {torch::cat(std::get<0>(all_states), 0), torch::cat(std::get<1>(all_states))} };
216 }
217
219 bool pad;
220 int64_t num_layers;
221 int64_t hidden_size;
222
223 float dropout;
224 torch::nn::Dropout drop;
225 torch::nn::Dropout rec_drop;
226
228
229 torch::nn::ModuleList cells;
230};
231TORCH_MODULE(LSTMwRecDropout);
232
233class PackedLSTMImpl : public torch::nn::Module
234{
235public:
236 PackedLSTMImpl() = default;
237 PackedLSTMImpl(int64_t input_size, int64_t hidden_size, int64_t num_layers,
238 bool bias=true, bool batch_first=false,
239 float dropout=0, bool bidirectional=false,
240 bool pad=false, float rec_dropout=0):
241 torch::nn::Module(),
242 batch_first(batch_first),
243 pad(pad)
244 {
245 if (rec_dropout == 0)
246 {
247 // # use the fast, native LSTM implementation
248 lstm = std::make_shared<torch::nn::LSTMImpl>(
249 torch::nn::LSTMOptions(input_size, hidden_size).num_layers(num_layers).batch_first(batch_first)
250 .bidirectional(bidirectional).bias(bias).dropout(dropout));
251 }
252 else
253 {
254 lstm = std::make_shared<LSTMwRecDropoutImpl>(input_size, hidden_size, num_layers, bias, batch_first,
255 dropout, bidirectional, rec_dropout);
256 }
257 }
258
259 std::tuple<torch::Tensor, std::tuple<torch::Tensor, torch::Tensor>> forward(torch::Tensor input, torch::Tensor lengths,
260 torch::optional<std::tuple<torch::Tensor, torch::Tensor>> hx = {})
261 {
262 // std::tuple<Tensor, Tensor> torch::nn::utils::rnn::pad_packed_sequence(PackedSequence sequence, bool batch_first = false, double padding_value = 0.0, c10::optional<int64_t> total_length = torch::nullopt)
263 // LSTM forward return type: std::tuple<Tensor, std::tuple<Tensor, Tensor>>
264 auto res = lstm.forward<std::tuple<torch::Tensor, std::tuple<torch::Tensor, torch::Tensor>>>(input, hx);
265 // if (pad)
266 // res = std::make_tuple(torch::nn::utils::rnn::pad_packed_sequence(res[0], batch_first=batch_first)[0], res[1]);
267 return res;
268 }
269
270 std::tuple<torch::nn::utils::rnn::PackedSequence, std::tuple<torch::Tensor, torch::Tensor>> forward_with_packed_input(const torch::nn::utils::rnn::PackedSequence &packed_input, torch::Tensor lengths,
271 torch::optional<std::tuple<torch::Tensor, torch::Tensor>> hx = {})
272 {
273 // std::tuple<Tensor, Tensor> torch::nn::utils::rnn::pad_packed_sequence(PackedSequence sequence, bool batch_first = false, double padding_value = 0.0, c10::optional<int64_t> total_length = torch::nullopt)
274 // auto input = torch::nn::utils::rnn::pack_padded_sequence(packed_input, lengths, batch_first);
275 auto effective = lstm.ptr<torch::nn::LSTMImpl>();
276 if (effective)
277 {
278 auto res = effective->forward_with_packed_input(packed_input, hx);
279 // if (pad)
280 // res = std::make_tuple(std::get<0>(torch::nn::utils::rnn::pad_packed_sequence(std::get<0>(res), batch_first)),
281 // std::get<1>(res));
282 return res;
283 }
284 else
285 {
286 auto effective_rec = lstm.ptr<LSTMwRecDropoutImpl>();
287 // LSTM forward_with_packed_input return type: std::tuple<torch::nn::utils::rnn::PackedSequence, std::tuple<torch::Tensor, torch::Tensor>>
288 auto res = effective_rec->forward(packed_input, hx);
289 // if (pad)
290 // res = std::make_tuple(std::get<0>(torch::nn::utils::rnn::pad_packed_sequence(std::get<0>(res), batch_first)),
291 // std::get<1>(res));
292 return res;
293 }
294 }
295
296 torch::nn::AnyModule lstm;
298 bool pad;
299};
300TORCH_MODULE(PackedLSTM);
301
305class HighwayLSTMImpl: public torch::nn::Module
306{
307public:
308 HighwayLSTMImpl() = default;
309 HighwayLSTMImpl(int64_t input_size, int64_t hidden_size,
310 int64_t num_layers=1, bool bias=true, bool batch_first=false,
311 float dropout=0, bool bidirectional=false, float rec_dropout=0,
312 std::function<torch::Tensor(const torch::Tensor&)> highway_func=nullptr,
313 bool pad=false):
314 torch::nn::Module(),
315 input_size(input_size),
316 hidden_size(hidden_size),
317 num_layers(num_layers),
318 bias(bias),
319 batch_first(batch_first),
320 dropout(dropout),
321 // dropout_state({}
322 bidirectional(bidirectional),
323 num_directions(bidirectional ? 2 : 1),
324 highway_func(highway_func),
325 pad(pad),
326 lstm(),
327 highway(),
328 gate(),
329 drop(torch::nn::DropoutOptions().p(dropout).inplace(true))
330 {
331 auto in_size = input_size;
332 for (int64_t l = 0; l < num_layers; l++)
333 {
334 lstm->push_back(PackedLSTM(in_size, hidden_size, 1, bias,
335 batch_first, 0, bidirectional, rec_dropout));
336 highway->push_back(torch::nn::Linear(in_size, hidden_size * num_directions));
337 gate->push_back(torch::nn::Linear(in_size, hidden_size * num_directions));
338 // highway[-1]->bias.data.zero_();
339 // gate[-1]->bias.data.zero_();
340 in_size = hidden_size * num_directions;
341 }
342 }
343
344 std::tuple<torch::Tensor, std::tuple<torch::Tensor, torch::Tensor>> forward(
345 torch::Tensor input, torch::Tensor seqlens,
346 std::tuple<torch::Tensor, torch::Tensor> hx={torch::Tensor(),torch::Tensor()})
347 {
348 highway_func = highway_func.target<torch::Tensor(const torch::Tensor&)>() == nullptr ? [](const torch::Tensor& t) { return t; } : highway_func;
349
350 std::vector<torch::Tensor> hs;
351 std::vector<torch::Tensor> cs;
352 auto packed_sequence = torch::nn::utils::rnn::pack_padded_sequence(input, seqlens, batch_first);
353
354 for (int64_t l = 0 ; l < num_layers; l++)
355 {
356 if (l > 0)
357 packed_sequence = torch::nn::utils::rnn::PackedSequence(drop(packed_sequence.data()),
358 packed_sequence.batch_sizes(),
359 packed_sequence.sorted_indices(),
360 packed_sequence.unsorted_indices());
361 auto layer_hx = std::get<0>(hx).numel() > 0 ?
362 std::make_tuple(std::get<0>(hx).index({torch::indexing::Slice(l * num_directions,(l+1)*num_directions)}),
363 std::get<1>(hx).index({torch::indexing::Slice(l * num_directions, (l+1)*num_directions)})) :
364 std::make_tuple(torch::Tensor(), torch::Tensor());
365 auto X = (lstm[l]->as<torch::nn::LSTMImpl>()) ?
366 lstm[l]->as<torch::nn::LSTMImpl>()->forward_with_packed_input(packed_sequence, layer_hx) :
367 lstm[l]->as<LSTMwRecDropoutImpl>()->forward(packed_sequence, layer_hx);
368 auto h = std::get<0>(X);
369 auto t = std::get<1>(X);
370 auto ht = std::get<0>(t);
371 auto ct = std::get<1>(t);
372 hs.push_back(ht);
373 cs.push_back(ct);
374
375 packed_sequence = torch::nn::utils::rnn::PackedSequence(
376 (h.data() + torch::sigmoid(gate[l]->as<torch::nn::Linear>()->forward(packed_sequence.data()))
377 * highway_func(highway[l]->as<torch::nn::Linear>()->forward(packed_sequence.data()))),
378 packed_sequence.batch_sizes(),
379 packed_sequence.sorted_indices(),
380 packed_sequence.unsorted_indices());
381 }
382
383 // if (pad)
384 // input = pad_packed_sequence(packed_sequence, batch_first=batch_first)[0];
385 return {input, {torch::cat(hs, 0), torch::cat(cs, 0)}};
386 }
387
388 int64_t input_size;
389 int64_t hidden_size;
390 int64_t num_layers;
391 bool bias;
393 float dropout;
394 // dropout_state;
397 std::function<torch::Tensor(const torch::Tensor&)> highway_func;
398 bool pad;
399
400 torch::nn::ModuleList lstm;
401 torch::nn::ModuleList highway;
402 torch::nn::ModuleList gate;
403 torch::nn::Dropout drop;
404
405};
406TORCH_MODULE(HighwayLSTM);
407
411class PairwiseBilinearImpl : public torch::nn::Module
412{
413public:
415 PairwiseBilinearImpl(int64_t input1_size, int64_t input2_size, int output_size, bool bias=true):
416 torch::nn::Module()
417 {
418 // TODO check lines below wrt to original Stanza's python code
419 // this->input1_size = input1_size;
420 // this->input2_size = input2_size;
421 this->output_size = output_size;
422
423 this->register_parameter("weight", torch::zeros({input1_size, input2_size, output_size}), false);
424 register_parameter("bias", bias ? torch::zeros({output_size}) : torch::zeros({}), false);
425 }
426
427 torch::Tensor forward(torch::Tensor input1, torch::Tensor input2)
428 {
429 auto input1_size = input1.sizes();
430 auto input2_size = input2.sizes();
431 // TODO check lines below wrt to original Stanza's python code
432 // std::vector<uint64_t> output_size = {input1_size[0], input1_size[1], input2_size[1], this->output_size};
433
434 // # ((N x L1) x D1) * (D1 x (D2 x O)) -> (N x L1) x (D2 x O)
435 auto intermediate = at::mm(input1.view({-1, input1_size[-1]}),
436 named_parameters()["weight"].view({-1, this->input2_size * this->output_size}));
437 // # (N x L2 x D2) -> (N x D2 x L2)
438 input2 = input2.transpose(1, 2);
439 // # (N x (L1 x O) x D2) * (N x D2 x L2) -> (N x (L1 x O) x L2)
440 auto output = intermediate.view({input1_size[0], input1_size[1] * this->output_size, input2_size[2]}).bmm(input2);
441 // # (N x (L1 x O) x L2) -> (N x L1 x L2 x O)
442 output = output.view({input1_size[0], input1_size[1], this->output_size, input2_size[1]}).transpose(2, 3);
443
444 return output;
445 }
446 int64_t input1_size, input2_size;
447 int64_t output_size;
448};
449TORCH_MODULE(PairwiseBilinear);
450
451class BiaffineScorerImpl : public torch::nn::Module
452{
453public:
455 BiaffineScorerImpl(int64_t input1_size, int64_t input2_size, int64_t output_size):
456 torch::nn::Module(),
457 W_bilin(input1_size + 1, input2_size + 1, output_size)
458 {
459
460 W_bilin->weight.data().zero_();
461 W_bilin->bias.data().zero_();
462 }
463
464 torch::Tensor forward(torch::Tensor input1, torch::Tensor input2)
465 {
466 // TODO uncomment and correct below
467 // input1 = torch::cat([input1, input1.new_ones(*input1.sizes()[:-1], 1)], input1.sizes().size()-1);
468 // input2 = torch::cat([input2, input2.new_ones(*input2.sizes()[:-1], 1)], input2.sizes().size()-1);
469 return W_bilin(input1, input2);
470 }
471 torch::nn::Bilinear W_bilin;
472};
473TORCH_MODULE(BiaffineScorer);
474
475class PairwiseBiaffineScorerImpl : public torch::nn::Module
476{
477public:
479 PairwiseBiaffineScorerImpl(int64_t input1_size, int64_t input2_size, int64_t output_size):
480 torch::nn::Module(),
481 W_bilin(input1_size + 1, input2_size + 1, output_size)
482 {
483 // TODO uncomment and correct below
484 // W_bilin->weight.data.zero_()
485 // W_bilin->bias.data.zero_()
486 }
487
488 torch::Tensor forward(torch::Tensor input1, torch::Tensor input2)
489 {
490 // TODO uncomment and correct below
491 // auto input1 = torch::cat([input1, input1.new_ones(*input1.size()[:-1], 1)], len(input1.size())-1)
492 // auto input2 = torch::cat([input2, input2.new_ones(*input2.size()[:-1], 1)], len(input2.size())-1)
493 return W_bilin(input1, input2);
494 }
495
496 PairwiseBilinear W_bilin;
497};
498TORCH_MODULE(PairwiseBiaffineScorer);
499
500class DeepBiaffineScorerImpl : public torch::nn::Module
501{
502public:
504 scorer(),
505 W1(0,0), W2(0,0) {}
506 DeepBiaffineScorerImpl(int64_t input1_size, int64_t input2_size,
507 int64_t hidden_size, int64_t output_size,
508 float dropout_value=0, bool pairwise=true,
509 std::function<torch::Tensor(const torch::Tensor&)> hidden_func=at::relu):
510 torch::nn::Module(),
511 scorer(),
512 dropout(dropout_value),
513 W1(input1_size, hidden_size),
514 W2(input2_size, hidden_size),
515 m_hidden_func(hidden_func)
516 {
517 if (pairwise)
518 scorer = std::make_shared<PairwiseBiaffineScorerImpl>(hidden_size, hidden_size, output_size);
519 else
520 scorer = std::make_shared<BiaffineScorerImpl>(hidden_size, hidden_size, output_size);
521 }
522
523 torch::Tensor forward(torch::Tensor input1, torch::Tensor input2)
524 {
525 return scorer.forward(dropout(m_hidden_func(W1(input1))), dropout(m_hidden_func(W2(input2))));
526 }
527
528 torch::nn::AnyModule scorer;
529 torch::nn::Dropout dropout;
530 torch::nn::Linear W1, W2;
531 std::function<torch::Tensor(const torch::Tensor&)> m_hidden_func;
532};
533TORCH_MODULE(DeepBiaffineScorer);
534
535class StanzaDepparseParserImpl : public torch::nn::Module
536{
537public:
539 StanzaDepparseParserImpl(int64_t word_emb_dim, int64_t tag_emb_dim, int64_t hidden_dim,
540 int64_t num_layers, float dropout, float rec_dropout,
541 std::shared_ptr<std::map<std::string, std::vector<std::string>>> vocab,
542 std::shared_ptr<std::vector<std::vector<std::string>>> feats_vocabs,
543 int64_t deep_biaff_hidden_dim,
544 bool linearize,
545 bool dist,
546 int64_t word_dropout);
547
548 std::pair<float, std::vector<torch::Tensor>> forward(
549 torch::Tensor word, torch::Tensor word_mask, torch::Tensor wordchars, torch::Tensor wordchars_mask,
550 torch::Tensor upos, torch::Tensor xpos, torch::Tensor ufeats, torch::Tensor pretrained,
551 torch::Tensor lemma, torch::Tensor head, torch::Tensor deprels, torch::Tensor word_orig_idx,
552 torch::Tensor sentlens, torch::Tensor wordlens);
553
554private:
555 torch::nn::utils::rnn::PackedSequence pack(torch::Tensor x, torch::Tensor sentlens);
556
557 std::shared_ptr<std::map<std::string, std::vector<std::string>>> m_vocab;
558 std::shared_ptr<std::vector<std::vector<std::string>>> m_feats_vocabs;
559 std::vector<std::string> m_unsaved_modules;
560 torch::nn::Embedding word_emb, lemma_emb, upos_emb, xpos_emb;
561 torch::nn::ModuleList ufeats_emb;
562 HighwayLSTM parserlstm;
563 torch::Tensor drop_replacement, parserlstm_h_init, parserlstm_c_init;
564 DeepBiaffineScorer unlabeled;
565 DeepBiaffineScorer deprel;
566 std::unique_ptr<DeepBiaffineScorer> linearization;
567 std::unique_ptr<DeepBiaffineScorer> distance;
568 torch::nn::CrossEntropyLoss crit;
569 torch::nn::Dropout drop;
570 WordDropout worddrop;
571 int64_t word_emb_dim;
572 int64_t num_layers;
573 int64_t hidden_dim;
574};
575
576TORCH_MODULE(StanzaDepparseParser);
577
578} // torch_modules
579} // nets
580} // deeplima
581
582#endif // DEEPLIMA_LIBS_NN_STANZA_MODELS_DEPPARSE_MODEL_H
torch::Tensor forward(torch::Tensor input1, torch::Tensor input2)
BiaffineScorerImpl(int64_t input1_size, int64_t input2_size, int64_t output_size)
torch::Tensor forward(torch::Tensor input1, torch::Tensor input2)
DeepBiaffineScorerImpl(int64_t input1_size, int64_t input2_size, int64_t hidden_size, int64_t output_size, float dropout_value=0, bool pairwise=true, std::function< torch::Tensor(const torch::Tensor &)> hidden_func=at::relu)
std::function< torch::Tensor(const torch::Tensor &)> m_hidden_func
Highway LSTM network, does NOT use the HLSTMCell above A Highway LSTM network, as used in the origina...
std::function< torch::Tensor(const torch::Tensor &)> highway_func
HighwayLSTMImpl(int64_t input_size, int64_t hidden_size, int64_t num_layers=1, bool bias=true, bool batch_first=false, float dropout=0, bool bidirectional=false, float rec_dropout=0, std::function< torch::Tensor(const torch::Tensor &)> highway_func=nullptr, bool pad=false)
std::tuple< torch::Tensor, std::tuple< torch::Tensor, torch::Tensor > > forward(torch::Tensor input, torch::Tensor seqlens, std::tuple< torch::Tensor, torch::Tensor > hx={torch::Tensor(), torch::Tensor()})
An LSTM implementation that supports recurrent dropout.
LSTMwRecDropoutImpl(int64_t input_size, int64_t hidden_size, int64_t num_layers, bool bias=true, bool batch_first=false, float dropout=0, bool bidirectional=false, bool pad=false, float rec_dropout=0)
std::pair< torch::Tensor, std::pair< torch::Tensor, torch::Tensor > > rnn_loop(torch::Tensor x, torch::Tensor batch_sizes, torch::nn::LSTMCellImpl *cell, std::vector< torch::Tensor > inits, bool reverse=false)
RNN loop for one layer in one direction with recurrent dropout Assumes input is PackedSequence,...
std::tuple< torch::nn::utils::rnn::PackedSequence, std::tuple< torch::Tensor, torch::Tensor > > forward(torch::nn::utils::rnn::PackedSequence input, torch::optional< std::tuple< torch::Tensor, torch::Tensor > > hx={})
std::tuple< torch::nn::utils::rnn::PackedSequence, std::tuple< torch::Tensor, torch::Tensor > > forward_with_packed_input(const torch::nn::utils::rnn::PackedSequence &packed_input, torch::Tensor lengths, torch::optional< std::tuple< torch::Tensor, torch::Tensor > > hx={})
std::tuple< torch::Tensor, std::tuple< torch::Tensor, torch::Tensor > > forward(torch::Tensor input, torch::Tensor lengths, torch::optional< std::tuple< torch::Tensor, torch::Tensor > > hx={})
PackedLSTMImpl(int64_t input_size, int64_t hidden_size, int64_t num_layers, bool bias=true, bool batch_first=false, float dropout=0, bool bidirectional=false, bool pad=false, float rec_dropout=0)
PairwiseBiaffineScorerImpl(int64_t input1_size, int64_t input2_size, int64_t output_size)
torch::Tensor forward(torch::Tensor input1, torch::Tensor input2)
A bilinear module that deals with broadcasting for efficient memory usage.
PairwiseBilinearImpl(int64_t input1_size, int64_t input2_size, int output_size, bool bias=true)
torch::Tensor forward(torch::Tensor input1, torch::Tensor input2)
A word dropout layer that's designed for embedded inputs (e.g., any inputs to an LSTM layer).
torch::Tensor forward(torch::Tensor x, torch::Tensor replacement=torch::Tensor())
TORCH_MODULE(DeepBiaffineAttentionDecoder)
TORCH_MODULE(BiRnnSeq2Seq)
STL namespace.
PUGI__FN void reverse(I begin, I end)
Definition pugixml.cpp:7457