Вы неправильно понимаете в 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
...