def __init__(self, fields_tuples, options): super().__init__(fields_tuples) self.words_vocab_size = len(self.fields_dict['words'].vocab) self.explainer_attn_top_k = options.explainer_attn_top_k self.message_type = options.message_type self.emb_size = options.word_embeddings_size self.explainer_cheat_ratio = options.explainer_cheat_ratio self.explainer_idf = options.explainer_idf self.explainer_ignore_top_words = options.explainer_ignore_top_words self.valid_top_word_ids = None # create an embedding layer to reencode the words embeddings_weight = None if self.fields_dict['words'].vocab.vectors is not None: embeddings_weight = self.fields_dict['words'].vocab.vectors options.word_embeddings_size = embeddings_weight.size(1) self.word_emb_explainer = nn.Embedding( num_embeddings=len(self.fields_dict['words'].vocab), embedding_dim=options.word_embeddings_size, padding_idx=constants.PAD_ID, _weight=embeddings_weight, ) if options.freeze_embeddings: self.word_emb_explainer.weight.requires_grad = False hidden_size = options.hidden_size[0] self.lstm_explainer = nn.LSTM(options.word_embeddings_size, hidden_size, batch_first=True, bidirectional=True) n = 2 if options.bidirectional else 1 concat_features_size = n * options.hidden_size[0] concat_features_size += self.nb_classes self.scorer = OperationScorer(concat_features_size, n * options.hidden_size[0], concat_features_size // 4, op='add', scaled=True) self.attn = Attention(self.scorer, dropout=options.attn_dropout, max_activation=options.attn_max_activation) # save for later self.lstm_hidden = None self.lstm_out = None init_xavier(self.lstm_explainer, dist='uniform') init_xavier(self.attn, dist='uniform') self.rec_layer_ae = nn.Linear(self.words_vocab_size, 100) self.rec_layer_ae_2 = nn.Linear(100, self.words_vocab_size) self.rec_layer_pred = nn.Linear(n * hidden_size, n * hidden_size) self.nb_documents = 0 self.idf = None if self.explainer_idf in ['embs', 'scores']: self.calc_idf(options)
def init_weights(self): init_xavier(self.linear_mid, dist='uniform') init_xavier(self.linear_message, dist='uniform') init_xavier(self.rnn_hyp, dist='uniform')
def init_weights(self): init_xavier(self.linear_input, dist='uniform') init_xavier(self.rnn_hyp, dist='uniform') init_xavier(self.linear_hyp, dist='uniform') init_xavier(self.linear_merge, dist='uniform')