Матрица умножения размеров сбивает с толку

Я следую этому руководству https://pytorch.org/tutorials/beginner/nlp/deep_learning_tutorial.html#example-logistic-regression-bag-of-words-classifier

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

См. также:  Документ наследования ODM с ошибкой создания схемы типа SINGLE_COLLECTION
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Abhishek Bhatia

    Вы недопонимаете в 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
    ...
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: