コード例 #1
0
class Generator(nn.Module):
    def __init__(self,
                 embedding_layer,
                 model_config,
                 train_config,
                 vocab_size,
                 max_len,
                 mode='train'):
        super(Generator, self).__init__()
        self.mode = mode
        self.train_config = train_config
        self.model_config = model_config
        self.vocab_size = vocab_size
        self.max_len = max_len
        self.embedding_layer = embedding_layer
        self.encoder = Encoder(self.model_config['embedding_size'],
                               self.model_config['hidden_dim'],
                               batch_size=self.train_config['batch_size'])
        self.decoder = Decoder(self.model_config['embedding_size'],
                               self.model_config['hidden_dim'],
                               vocab_size,
                               max_len,
                               batch_size=self.train_config['batch_size'])
        # if self.mode == 'train':
        # 	self.encoder.train()
        # 	self.decoder.train()
        # else:
        # 	self.encoder.eval()
        # 	self.decoder.eval()

    def forward(self, input):

        self.encoder.hidden = self.encoder.init_hidden()
        encoder_outputs, encoder_hidden = self.encoder(
            self.embedding_layer(input).view(input.size(0),
                                             self.train_config['batch_size'],
                                             -1))

        decoder_input = self.get_new_dec_input(SOS_token).cuda()
        decoder_hidden = encoder_hidden

        decoded_embeddings = []

        for di in range(input.size(0)):

            decoder_input = self.embedding_layer(decoder_input).view(
                1, self.train_config['batch_size'], -1)
            decoder_output, decoder_hidden = self.decoder(
                decoder_input, decoder_hidden, encoder_outputs)

            decoded_embeddings.append(decoder_output)

            topv, topi = decoder_output.topk(1)
            decoded_token = topi.squeeze().detach()

            decoder_input = self.get_new_dec_input(decoded_token).cuda()

            if decoded_token == EOS_token:
                break

        return torch.cat(decoded_embeddings, 0)

    def get_new_dec_input(self, token_idx):

        decoder_input = torch.zeros(self.vocab_size).unsqueeze(0)
        decoder_input[0, token_idx] = 1.0

        return decoder_input