Как изменить ось, на которой выполняется одномерная свертка на слое встраивания в PyTorch? - PullRequest
0 голосов
/ 18 марта 2019

Я играл с классификацией текста в PyTorch и столкнулся с проблемой одномерных сверток.

Я установил слой вложения для измерений (x, y, z), где: x - обозначает размер пакета y - обозначает длину предложения (фиксировано с отступом, поэтому 40 слов) z -размерность предварительно обученного встраивания слов (на данный момент 100)

Для простоты, давайте предположим, что я положил в матрицу (1,40, 100)

Однако, когда мне известно один разЯ выполняю torch.nn.conv1d (* args), полученная матрица (размер пакета = 1, размер слова = 40, размер карты объектов = 98) с размером ядра 3.

В принципе, как я понимаюон сворачивается вокруг оси y вместо оси x, и его поворот не фиксирует пространственные отношения между вложениями слов.

Есть ли способ изменить сверточный слой, чтобы он вычислял карты объектов вокруг другой оси?

TL, DR:

На уровне встраивания слой факела ведет себя следующим образом: введите описание изображения здесь

Но я хочу, чтобы он вел себя так

введите описание изображенияздесь

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Транспонирование вложений при оценке графа до свертки:

    def forward(self, bacth_text):
        x = self.embeddings(batch_text)
        x = torch.transpose(x, 1, 2)
        x = self.conv1d(x)
0 голосов
/ 19 марта 2019

conv1d ожидает, что размер ввода будет (batch_size, num_channels, length), и изменить его невозможно, поэтому у вас есть два возможных пути впереди, вы можете либо permute выводить встраивания или вы можете использовать conv1d вместо встраиваемого слоя (in_channels = num_words, out_channels = word_embedding_size и kernel_size = 1), который медленнее встраивания и не очень хорошая идея!

input = torch.randint(0, 10, (batch_size, sentence_length))
embeddings = word_embedding(input) #(batch_size, sentence_length, embedding_size)
embeddings_permuted = embeddings.permute(0, 2, 1) #(batch_size, embedding_size, sentence_length)
conv_out = convolution(embeddings_permuted) #(batch_size, conv_out_channels, changed_sentence_length)
#now you can either use the output as it is or permute it back (based on your upper layers)
#also note that I wrote changed_sentence_length because it is a fucntion of your padding and stride 
...