Пример #1
0
 def __init__(self, opt):
     super(MultiTaskBasicModel, self).__init__()
     memory_bank_size = 2 * opt.encoder_size if opt.bidirectional else opt.encoder_size
     self.seq2seq_model = Seq2SeqModel(opt)
     if opt.classifier_type == "max":
         self.classifier_model = MaxPoolClassifier(memory_bank_size, opt.num_classes, opt.classifier_dropout, opt.ordinal)
     elif opt.classifier_type == "word_attn":
         self.classifier_model = WordAttnClassifier(opt.query_hidden_size, memory_bank_size, opt.num_classes, opt.attn_mode, opt.classifier_dropout, opt.ordinal)
     elif opt.classifier_type == "word_attn_no_query":
         self.classifier_model = WordAttnNoQueryClassifier(memory_bank_size, opt.num_classes, opt.classifier_dropout,
                                                     opt.ordinal)
     elif opt.classifier_type == "word_multi_hop_attn":
         self.classifier_model = WordMultiHopAttnClassifier(opt.query_hidden_size, memory_bank_size, opt.num_classes,
                                                      opt.attn_mode, opt.classifier_dropout, opt.ordinal)
     else:
         raise ValueError
     self.model_type = opt.model_type
     self.classifier_type = opt.classifier_type
    def __init__(self, opt, rating_tokens_tensor=None):
        """Initialize model.
        :param rating_tokens_tensor: a LongTensor, [5, rating_v_size], stores the top rating_v_size tokens' indexs of each rating score
        """
        super(MultiTaskBasicClassifySeq2Seq, self).__init__()

        self.vocab_size = len(opt.word2idx)
        self.emb_dim = opt.word_vec_size
        self.num_directions = 2 if opt.bidirectional else 1
        self.encoder_size = opt.encoder_size
        self.decoder_size = opt.decoder_size
        self.memory_bank_size = self.num_directions * self.encoder_size
        #self.ctx_hidden_dim = opt.rnn_size
        self.batch_size = opt.batch_size
        self.bidirectional = opt.bidirectional
        self.enc_layers = opt.enc_layers
        self.dec_layers = opt.dec_layers
        self.dropout = opt.dropout
        self.model_type = opt.model_type

        self.bridge = opt.bridge

        self.coverage_attn = opt.coverage_attn
        self.copy_attn = opt.copy_attention

        # for rating memory
        self.rating_memory_pred = opt.rating_memory_pred
        self.rating_memory_type = opt.rating_memory_type
        self.rating_bridge_type = opt.rating_bridge_type
        if self.rating_memory_pred:
            assert rating_tokens_tensor is not None, "The rating_tokens_tensor is needed when rating_memory_pred is True"
            self.rating_tokens_tensor = rating_tokens_tensor.cuda()
            if self.rating_bridge_type == 'relu_one_layer':
                self.rating_bridge = nn.Sequential(nn.Linear(self.emb_dim, self.emb_dim),
                                                   nn.Dropout(p=self.dropout),
                                                   nn.ReLU())
            elif self.rating_bridge_type == 'tanh_one_layer':
                self.rating_bridge = nn.Sequential(nn.Linear(self.emb_dim, self.emb_dim),
                                                   nn.Dropout(p=self.dropout),
                                                   nn.Tanh())
            else:
                self.rating_bridge = None
        else:
            self.rating_tokens_tensor = None
            self.rating_bridge = None

        self.pad_idx_src = io.PAD
        self.pad_idx_trg = io.PAD
        self.bos_idx = io.BOS
        self.eos_idx = io.EOS
        self.unk_idx = io.UNK
        self.sep_idx = None
        # self.sep_idx = opt.word2idx['.']
        self.orthogonal_loss = opt.orthogonal_loss

        if self.orthogonal_loss:
            assert self.sep_idx is not None

        self.share_embeddings = opt.share_embeddings
        self.review_attn = opt.review_attn

        self.attn_mode = opt.attn_mode

        self.hr_enc = opt.encoder_type == "hre_brnn"
        #self.separate_layer_enc = opt.encoder_type == 'sep_layers_brnn' or opt.encoder_type == 'sep_layers_brnn_reverse'
        if opt.encoder_type == 'sep_layers_brnn':
            self.separate_mode = 1
            self.separate_layer_enc = True
        elif opt.encoder_type == 'sep_layers_brnn_reverse':
            self.separate_mode = 2
            self.separate_layer_enc = True
        elif opt.encoder_type == 'rnn' and opt.enc_layers == 2 and opt.residual:
            self.separate_mode = 0
            self.separate_layer_enc = False
        elif opt.residual and opt.enc_layers != 2:
            raise ValueError
        else:
            self.separate_mode = -1
            self.separate_layer_enc = False
        #self.separate_layer_enc_reverse = opt.encoder_type == 'sep_layers_brnn_reverse'

        self.num_classes = opt.num_classes
        self.classifier_type = opt.classifier_type
        self.dec_classify_input_type = opt.dec_classify_input_type
        if opt.classifier_type == "word_attn":
            self.enc_classifier = WordAttnClassifier(opt.query_hidden_size, self.memory_bank_size, opt.num_classes, opt.attn_mode, opt.classifier_dropout, opt.ordinal, self.hr_enc)
        elif opt.classifier_type == "max":
            self.enc_classifier = MaxPoolClassifier(self.memory_bank_size, opt.num_classes, opt.classifier_dropout, opt.ordinal, self.hr_enc)
        elif opt.classifier_type == "word_attn_no_query":
            self.enc_classifier = WordAttnNoQueryClassifier(self.memory_bank_size, opt.num_classes, opt.classifier_dropout, opt.ordinal, self.hr_enc)
        elif opt.classifier_type == "word_multi_hop_attn":
            self.enc_classifier = WordMultiHopAttnClassifier(opt.query_hidden_size, self.memory_bank_size, opt.num_classes, opt.attn_mode, opt.classifier_dropout, opt.ordinal, self.hr_enc)
        else:
            raise ValueError

        if self.hr_enc:
            self.encoder = CatHirRNNEncoder(
                vocab_size=self.vocab_size,
                embed_size=self.emb_dim,
                hidden_size=self.encoder_size,
                num_layers=self.enc_layers,
                bidirectional=self.bidirectional,
                pad_token=self.pad_idx_src,
                dropout=self.dropout
            )
        elif self.separate_mode >= 0:
            self.encoder = TwoLayerRNNEncoder(
                vocab_size=self.vocab_size,
                embed_size=self.emb_dim,
                hidden_size=self.encoder_size,
                num_layers=self.enc_layers,
                bidirectional=self.bidirectional,
                pad_token=self.pad_idx_src,
                dropout=self.dropout,
                separate_mode=self.separate_mode,
                residual=opt.residual
            )
        else:
            self.encoder = RNNEncoderBasic(
                vocab_size=self.vocab_size,
                embed_size=self.emb_dim,
                hidden_size=self.encoder_size,
                num_layers=self.enc_layers,
                bidirectional=self.bidirectional,
                pad_token=self.pad_idx_src,
                dropout=self.dropout
            )

        self.decoder = MultiTaskBasicDecoder(
            vocab_size=self.vocab_size,
            embed_size=self.emb_dim,
            hidden_size=self.decoder_size,
            num_layers=self.dec_layers,
            memory_bank_size=self.num_directions * self.encoder_size,
            coverage_attn=self.coverage_attn,
            copy_attn=self.copy_attn,
            review_attn=self.review_attn,
            pad_idx=self.pad_idx_trg,
            attn_mode=self.attn_mode,
            dropout=self.dropout,
            hr_enc=self.hr_enc,
            out_sentiment_context=False,
            rating_memory_pred=self.rating_memory_pred
        )

        if self.bridge == 'dense':
            self.bridge_layer = nn.Linear(self.encoder_size * self.num_directions, self.decoder_size)
        elif opt.bridge == 'dense_nonlinear':
            self.bridge_layer = nn.tanh(nn.Linear(self.encoder_size * self.num_directions, self.decoder_size))
        else:
            self.bridge_layer = None

        if self.bridge == 'copy':
            assert self.encoder_size * self.num_directions == self.decoder_size, 'encoder hidden size and decoder hidden size are not match, please use a bridge layer'

        if self.share_embeddings:
            self.encoder.embedding.weight = self.decoder.embedding.weight

        self.init_embedding_weights()
    def __init__(self, opt):
        """Initialize model."""
        super(ExternalFeedClassifySeq2Seq, self).__init__()

        self.vocab_size = len(opt.word2idx)
        self.emb_dim = opt.word_vec_size
        self.num_directions = 2 if opt.bidirectional else 1
        self.encoder_size = opt.encoder_size
        self.decoder_size = opt.decoder_size
        self.memory_bank_size = self.num_directions * self.encoder_size
        #self.ctx_hidden_dim = opt.rnn_size
        self.batch_size = opt.batch_size
        self.bidirectional = opt.bidirectional
        self.enc_layers = opt.enc_layers
        self.dec_layers = opt.dec_layers
        self.dropout = opt.dropout
        self.model_type = opt.model_type

        self.rating_embedding = nn.Embedding(opt.num_classes, self.emb_dim)

        self.bridge = opt.bridge

        self.coverage_attn = opt.coverage_attn
        self.copy_attn = opt.copy_attention

        self.pad_idx_src = io.PAD
        self.pad_idx_trg = io.PAD
        self.bos_idx = io.BOS
        self.eos_idx = io.EOS
        self.unk_idx = io.UNK
        self.sep_idx = None
        # self.sep_idx = opt.word2idx['.']
        self.orthogonal_loss = opt.orthogonal_loss

        if self.orthogonal_loss:
            assert self.sep_idx is not None

        self.share_embeddings = opt.share_embeddings
        self.review_attn = opt.review_attn

        self.attn_mode = opt.attn_mode

        self.num_classes = opt.num_classes
        if opt.classifier_type == "word_attn":
            self.classifier = WordAttnClassifier(
                opt.query_hidden_size, self.memory_bank_size, opt.num_classes,
                opt.attn_mode, opt.classifier_dropout, opt.ordinal)
        elif opt.classifier_type == "max":
            self.classifier = MaxPoolClassifier(self.memory_bank_size,
                                                opt.num_classes,
                                                opt.classifier_dropout,
                                                opt.ordinal)
        elif opt.classifier_type == "word_attn_no_query":
            self.classifier = WordAttnNoQueryClassifier(
                self.memory_bank_size, opt.num_classes, opt.classifier_dropout,
                opt.ordinal)
        elif opt.classifier_type == "word_multi_hop_attn":
            self.classifier = WordMultiHopAttnClassifier(
                opt.query_hidden_size, self.memory_bank_size, opt.num_classes,
                opt.attn_mode, opt.classifier_dropout, opt.ordinal)
        else:
            raise ValueError

        self.classifier_type = opt.classifier_type

        #self.goal_vector_mode = opt.goal_vector_mode
        #self.goal_vector_size = opt.goal_vector_size
        #self.manager_mode = opt.manager_mode

        self.hr_enc = opt.encoder_type == "hre_brnn"

        if self.hr_enc:
            self.encoder = CatHirRNNEncoder(vocab_size=self.vocab_size,
                                            embed_size=self.emb_dim,
                                            hidden_size=self.encoder_size,
                                            num_layers=self.enc_layers,
                                            bidirectional=self.bidirectional,
                                            pad_token=self.pad_idx_src,
                                            dropout=self.dropout)
        else:
            self.encoder = RNNEncoderBasic(vocab_size=self.vocab_size,
                                           embed_size=self.emb_dim,
                                           hidden_size=self.encoder_size,
                                           num_layers=self.enc_layers,
                                           bidirectional=self.bidirectional,
                                           pad_token=self.pad_idx_src,
                                           dropout=self.dropout)

        self.decoder = ExternalFeedDecoder(
            vocab_size=self.vocab_size,
            embed_size=self.emb_dim,
            hidden_size=self.decoder_size,
            num_layers=self.dec_layers,
            memory_bank_size=self.num_directions * self.encoder_size,
            coverage_attn=self.coverage_attn,
            copy_attn=self.copy_attn,
            review_attn=self.review_attn,
            pad_idx=self.pad_idx_trg,
            attn_mode=self.attn_mode,
            dropout=self.dropout,
            hr_enc=self.hr_enc)

        if self.bridge == 'dense':
            self.bridge_layer = nn.Linear(
                self.encoder_size * self.num_directions, self.decoder_size)
        elif opt.bridge == 'dense_nonlinear':
            self.bridge_layer = nn.tanh(
                nn.Linear(self.encoder_size * self.num_directions,
                          self.decoder_size))
        else:
            self.bridge_layer = None

        if self.bridge == 'copy':
            assert self.encoder_size * self.num_directions == self.decoder_size, 'encoder hidden size and decoder hidden size are not match, please use a bridge layer'
        """
        if self.separate_present_absent and self.goal_vector_mode > 0:
            if self.manager_mode == 2:  # use GRU as a manager
                self.manager = nn.GRU(input_size=self.decoder_size, hidden_size=self.goal_vector_size, num_layers=1, bidirectional=False, batch_first=False, dropout=self.dropout)
                self.bridge_manager = opt.bridge_manager
                if self.bridge_manager:
                    self.manager_bridge_layer = nn.Linear(self.encoder_size * self.num_directions, self.goal_vector_size)
                else:
                    self.manager_bridge_layer = None
            elif self.manager_mode == 1:  # use two trainable vectors only
                self.manager = ManagerBasic(self.goal_vector_size)
        """

        if self.share_embeddings:
            self.encoder.embedding.weight = self.decoder.embedding.weight

        self.init_embedding_weights()
    def __init__(self, opt, rating_tokens_tensor=None):
        """Initialize model.
        :param rating_tokens_tensor: a LongTensor, [5, rating_v_size], stores the top rating_v_size tokens' indexs of each rating score
        """
        super(RnnEncSingleClassifier, self).__init__()

        self.vocab_size = len(opt.word2idx)
        self.emb_dim = opt.word_vec_size
        self.num_directions = 2 if opt.bidirectional else 1
        self.encoder_size = opt.encoder_size
        self.memory_bank_size = self.num_directions * self.encoder_size
        self.batch_size = opt.batch_size
        self.bidirectional = opt.bidirectional
        self.enc_layers = opt.enc_layers
        self.dropout = opt.dropout
        self.model_type = opt.model_type

        self.pad_idx_src = io.PAD
        # self.pad_idx_trg = io.PAD
        # self.bos_idx = io.BOS
        # self.eos_idx = io.EOS
        self.unk_idx = io.UNK
        self.hr_enc = opt.encoder_type == "hre_brnn"
        if opt.encoder_type == 'sep_layers_brnn':
            self.separate_mode = 1
            self.separate_layer_enc = True
        elif opt.encoder_type == 'sep_layers_brnn_reverse':
            self.separate_mode = 2
            self.separate_layer_enc = True
        elif opt.encoder_type == 'rnn' and opt.enc_layers == 2 and opt.residual:
            self.separate_mode = 0
            self.separate_layer_enc = False
        elif opt.residual and opt.enc_layers != 2:
            raise ValueError
        else:
            self.separate_mode = -1
            self.separate_layer_enc = False
        #self.separate_layer_enc_reverse = opt.encoder_type == 'sep_layers_brnn_reverse'

        self.num_classes = opt.num_classes
        self.classifier_type = opt.classifier_type
        if opt.classifier_type == "word_attn":
            self.enc_classifier = WordAttnClassifier(opt.query_hidden_size,
                                                     self.memory_bank_size,
                                                     opt.num_classes,
                                                     opt.attn_mode,
                                                     opt.classifier_dropout,
                                                     opt.ordinal, self.hr_enc)
        elif opt.classifier_type == "max":
            self.enc_classifier = MaxPoolClassifier(self.memory_bank_size,
                                                    opt.num_classes,
                                                    opt.classifier_dropout,
                                                    opt.ordinal, self.hr_enc)
        elif opt.classifier_type == "word_attn_no_query":
            self.enc_classifier = WordAttnNoQueryClassifier(
                self.memory_bank_size, opt.num_classes, opt.classifier_dropout,
                opt.ordinal, self.hr_enc)
        elif opt.classifier_type == "word_multi_hop_attn":
            self.enc_classifier = WordMultiHopAttnClassifier(
                opt.query_hidden_size, self.memory_bank_size, opt.num_classes,
                opt.attn_mode, opt.classifier_dropout, opt.ordinal,
                self.hr_enc)
        else:
            raise ValueError

        if self.hr_enc:
            self.encoder = CatHirRNNEncoder(vocab_size=self.vocab_size,
                                            embed_size=self.emb_dim,
                                            hidden_size=self.encoder_size,
                                            num_layers=self.enc_layers,
                                            bidirectional=self.bidirectional,
                                            pad_token=self.pad_idx_src,
                                            dropout=self.dropout)
        elif self.separate_mode >= 0:
            self.encoder = TwoLayerRNNEncoder(vocab_size=self.vocab_size,
                                              embed_size=self.emb_dim,
                                              hidden_size=self.encoder_size,
                                              num_layers=self.enc_layers,
                                              bidirectional=self.bidirectional,
                                              pad_token=self.pad_idx_src,
                                              dropout=self.dropout,
                                              separate_mode=self.separate_mode,
                                              residual=opt.residual)
        else:
            self.encoder = RNNEncoderBasic(vocab_size=self.vocab_size,
                                           embed_size=self.emb_dim,
                                           hidden_size=self.encoder_size,
                                           num_layers=self.enc_layers,
                                           bidirectional=self.bidirectional,
                                           pad_token=self.pad_idx_src,
                                           dropout=self.dropout)

        self.init_embedding_weights()