Как изменить ось, на которой выполняется одномерная свертка на слое внедрения в PyTorch?

Только для записи чистым решением JDK8 было бы использовать метод Map::compute:

map.compute(key, (s, strings) -> strings == null ? new ArrayList<>() : strings).add(value);

Например, как

public static void main(String[] args) {
    Map<String, List<String>> map = new HashMap<>();

    put(map, "first", "hello");
    put(map, "first", "foo");
    put(map, "bar", "foo");
    put(map, "first", "hello");

    map.forEach((s, strings) -> {
        System.out.print(s + ": ");
        System.out.println(strings.stream().collect(Collectors.joining(", ")));
    });
}

private static <KEY, VALUE> void put(Map<KEY, List<VALUE>> map, KEY key, VALUE value) {
    map.compute(key, (s, strings) -> strings == null ? new ArrayList<>() : strings).add(value);
}

с выходом:

bar: foo
first: hello, foo, hello

Обратите внимание, что для обеспечения согласованности в случае, когда несколько потоков обращаются к этой структуре данных, необходимо использовать ConcurrentHashMap и CopyOnWriteArrayList.

0
задан Pijus Eigirdas 18 March 2019 в 17:32
поделиться

2 ответа

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

0
ответ дан Separius 18 March 2019 в 17:32
поделиться

Транспонировать вложения во время вычисления графа перед сверткой:

    def forward(self, bacth_text):
        x = self.embeddings(batch_text)
        x = torch.transpose(x, 1, 2)
        x = self.conv1d(x)
0
ответ дан NotImplemented 18 March 2019 в 17:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: