Я разрабатываю простую модель для изучения встраивания слов.Для простоты, скажем, у меня есть размер вокаба, равный 100, каждый вектор вложения имеет размер 3, а размер пакета равен 10. Каждое вложение будет опираться с помощью вложения двух слов до и после целевого слова.
ВпередПропустив, я написал функцию, ожидающую для ее ввода вектор, содержащий вложения 4 контекстных слов
def __init__(self, vocab_size, embedding_dim):
super(CBOW, self).__init__()
self.embeddings = nn.Embedding(vocab_size, embedding_dim)
self.linear1 = nn.Linear(4 * embedding_dim, 12)
self.linear2 = nn.Linear(12, vocab_size)
def forward(self, inputs):
embeds = self.embeddings(inputs).view((1, -1))
out = F.relu(self.linear1(embeds))
out = self.linear2(out)
log_probs = F.log_softmax(out, dim=1)
return log_probs
Затем я запускаю модель
model = CBOW(len(vocab), EMBEDDING_DIM).cuda()
model = nn.DataParallel(model, device_ids=[0])
Однако, когда я отправляю данные пакета, вход будет иметь 10 входов для передачи.Таким образом, он дает мне и ошибку, что он ожидает 4 * EMBEDDING_DIM, однако он получает 10 * 4 * EMBEDDING_DIM.Я ожидал, что распараллеливание всей модели автоматически позаботится об этом.Есть идеи, как решить эту проблему?