Только для записи чистым решением 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
.
conv1d ожидает, что размер входа будет (batch_size, num_channels, length), и изменить его невозможно, поэтому у вас есть два возможных пути впереди, вы можете permute
вывести встраивания или вы можете использовать conv1d вместо встраиваемого слоя (in_channels = num_words, out_channels = word_embedding_size и kernel_size = 1), который медленнее встраивания и не очень хорошая идея!
Транспонировать вложения во время вычисления графа перед сверткой:
def forward(self, bacth_text):
x = self.embeddings(batch_text)
x = torch.transpose(x, 1, 2)
x = self.conv1d(x)