Горячее кодирование в pytorch / torchtext - PullRequest
1 голос
/ 09 июля 2019

У меня есть Bucketiterator из torchtext, который я передаю модели в pytorch.Пример построения итератора:

train_iter, val_iter = BucketIterator.splits((train,val),
                                             batch_size=batch_size,
                                             sort_within_batch = True, 
                                             device = device, 
                                             shuffle=True, 
                                             sort_key=lambda x: (len(x.src), len(x.trg)))

Затем данные поступают в такую ​​модель, где я использую слой nn.Embedding.

class encoder(nn.Module):
    def __init__(self, input_dim, emb_dim, hid_dim, n_layers, dropout):
        super().__init__()

        self.input_dim = input_dim
        self.emb_dim = emb_dim
        self.hid_dim = hid_dim
        self.n_layers = n_layers
        self.dropout = dropout

        self.embedding = nn.Embedding(input_dim, emb_dim)

        self.rnn = nn.LSTM(emb_dim, hid_dim, n_layers, dropout = dropout)

        self.dropout = nn.Dropout(dropout)

    def forward(self, src):

        #src = [src sent len, batch size]

        embedded = self.dropout(self.embedding(src))

        #embedded = [src sent len, batch size, emb dim]
        hidden_enc = []
        outputs, hidden = self.rnn(embedded[0,:,:].unsqueeze(0))
        for i in range(1,len(embedded[:,1,1])):
            outputs, hidden = self.rnn(embedded[i,:,:].unsqueeze(0),hidden)
            hidden_cpu = []
            for k in range(len(hidden)):
                hidden_cpu.append(hidden[k])
                hidden_cpu[k] = hidden[k].cpu()
            hidden_enc.append(tuple(hidden_cpu))



        #outputs, hidden = self.rnn(embedded)

        #outputs = [src sent len, batch size, hid dim * n directions]
        #hidden = [n layers * n directions, batch size, hid dim]
        #cell = [n layers * n directions, batch size, hid dim]
        None
        #outputs are always from the top hidden layer

        return hidden, hidden_enc

Но что, если бы я хотел, чтобы вложение было закодировано горячим способом?Я работаю над формальными языками, и было бы неплохо сохранить ортогональность между токенами.Похоже, что pytorch или torchtext не имеет какой-либо функциональности для этого.

...