Генерируйте векторы предложений с помощью GRU, используя pytorch

Я пытаюсь сгенерировать векторы предложений, используя GRU в pytorch. У меня есть истории, которые разделены на предложения. Поэтому я читаю истории, делю предложения по словам и превращаю их в целые числа. Например, партия с 2 образцами:

(0 ,.,.) = 
19  21  28  3    0    0
25  16  28  4    17   0
0   0    0  0    0    0
(1 ,.,.) =  
19  21  28  3    0    0
25  16  28  4    0    0
15  28  26  27   17   0

Каждая строка - это одно предложение, а каждое число - это слово. Я хочу иметь векторное представление для каждой строки. Предполагая размерность 5:

(0 ,.,.) = 
 0.1619 -0.0605 -0.3301 -0.0433  0.2786
-0.2069 -0.3152 -0.4366  0.1272  0.3375
 0       0       0       0       0
(1 ,.,.) = 
-0.1599 -0.0730 -0.3796  0.0214  0.2157
-0.0805 -0.1307 -0.3942  0.0648  0.2704
 0.0275 -0.2353 -0.4399  0.0687  0.3218

Ранее я генерировал векторы предложений путем суммирования по векторам слов, и точность модели составляла 99%. С этим кодом (кодер с GRU) я могу получить только 30%:

embedding_dim =  5 
input_embed= embedding(story.view(story.size(0), -1)) 
slen = torch.LongTensor([2,3])
sentlens = torch.DoubleTensor([[4,5,0],[4,4,5]])
def encoder_gru(input_embed,slen,sentlens,n_layers=1,hidden=None):
    """ for one sample 
    Args: 
       input_embed : embedding of input text of size batch*nbrSent*nbrWord*dim
              slen : tensor, number of sentences in the story
          sentlens : tensor, number of words in each sentences
            hidden : tensor, init hidden layer of gru
    """
    # choose not-padded sentences from story
    batch_size = input_embed.size(0)

    # contains sentence vectors
    hidden_batch = torch.zeros(batch_size,max(slen),embedding_dim)
    st = 0

    for b in range(batch_size):
        iembed = input_embed[b,0:slen[b]] # takes non-padded rows 
        bsent = sentlens[b,0:slen[b]] # takes number of words in non-padded sentences
        # get ordered pack
        sorted_slens,idx = bsent.sort(0,descending=True)
        sorted_iembed = iembed[idx]
        pack = torch.nn.utils.rnn.pack_padded_sequence(sorted_iembed, sorted_slens.tolist(), batch_first=True)
        h0 = Variable(torch.randn(n_layers,slen[b],embedding_dim))
        out,hidden_out = self.gru(pack,h0)
        # unpacked, unpacked_len = torch.nn.utils.rnn.pad_packed_sequence(out, batch_first=True)
        _,inv_idx = idx.sort() # sort the outputs again, undo 1st order
        hidden_batch[b,0:slen[b]] = hidden_out[-1][inv_idx].data.clone()
    return hidden_batch

Мои вопросы:

  1. Я могу генерировать векторы, но точность всей моей модели хуже, чем раньше, я не могу понять, что не так с этим шагом.
  2. Как я могу проверить, что векторы предложений являются хорошим представлением помимо тестирования всей модели?
  3. Есть ли более умный способ сделать это без использования цикла for для пакета?

0 ответов

Другие вопросы по тегам