Матрица измерений умножения сбивает с толку - PullRequest
0 голосов
/ 02 мая 2020

Я следую этому уроку https://pytorch.org/tutorials/beginner/nlp/deep_learning_tutorial.html#example -logisti c -regression-Bag-of-Word-классификатор

nn.Linear(vocab_size, num_labels) означает, что форма матрицы num_labels x vocab_size

Размеры bow_vector равны 1 x vocab_size, а ожидаемое значение для nn.linear равно batch_size x features

Теперь мы умножаем матрицу num_labels x vocab_size на 1 x vocab_size. Таким образом, размеры не совпадают для умножения матриц. Что мне здесь не хватает? : мышление:

https://discuss.pytorch.org/t/matrix-multiplication-dimentions-confusing/79376?u=abhigenie92

1 Ответ

0 голосов
/ 02 мая 2020

Вы неправильно понимаете в nn.Linear. Позвольте мне указать вам немного.

nn.Linear(vocab_size, num_labels) не означает, что форма матрицы num_labels x vacab_size.

Оригинал nn.Linear(input_dim, output_dim, bias=True). Допустим, у вас есть 3 точки в 3D-пространстве, и вы хотите проецировать эти точки в 2D-пространство. Таким образом, вы просто создаете линейный слой, который может помочь вам сделать это => nn.Linear(3, 2, bias=True).

Примеры:

linear_function = nn.Linear(3, 2, bias=True) # you have just created a function
a_3D_point = torch.Tensor([[1, 1, 1]])
a_2D_point = linear_function(a_3D_point)

По сути, nn.Linear() просто поможет вам создать функцию, которая может выполнять проекция.

Так что вы можете задаться вопросом, как nn.Linear может помочь вам сделать проекцию. Что ж, в математике довольно легко, когда проекция равна y = Wx + b или y = Wx (в случае, если смещение = False), где W - это вес, а b - это смещение, и оба они будут случайным образом созданы nn.Linear. Проверьте это:

print(list(linear_function.parameters()))  # Unchecked since I use my iPad to write this answer

================

В соответствии с вашим делом, BowClassifier, насколько я понимаю, просто попытаться классифицировать предложение на конечные классы. Один из самых простых способов сделать это - использовать один горячий вектор, который имеет форму n x vocab.

n означает, что у вас есть предложение n, но воаб во втором измерении теперь играет роль функции, которые представляют каждое предложение.

Теперь вы хотите классифицировать n предложений в класс num_labels, просто сделайте проекцию.

input = ...  # shape: [n x vocab]
classify_fn = nn.Linear(vocab, num_labels)
output = classify_fn(input)

# sigmoid or softmax to get the probability here
...
...