PyTorch - неожиданная форма весов параметров модели - PullRequest
0 голосов
/ 01 мая 2020

Я создал полностью подключенную сеть в Pytorch с входным слоем формы (1,784) и первым скрытым слоем формы (1,256). Быть коротким: nn.Linear(in_features=784, out_features=256, bias=True)

Метод 1: model.fc1.weight.data.shape дает мне torch.Size([128, 256]), а

Метод 2: list(model.parameters())[0].shape дает мне torch.Size([256, 784])

В На самом деле, между входным слоем размером 784 и скрытым слоем размером 256 я ожидал матрицу формы (784,256). Итак, в первом случае я вижу форму следующего скрытого слоя (128), который не имеет смысла для весов между входным и первым скрытым слоем, и, во втором случае, похоже, что Pytorch принял преобразование весовой матрицы.

Я не совсем понимаю, как Pytorch формирует различные весовые матрицы и как я могу получить доступ к индивидуальным весам после тренировки. Должен ли я использовать метод 1 или 2? Когда я отображаю соответствующие тензоры, дисплеи выглядят совершенно одинаково, а формы разные.

1 Ответ

1 голос
/ 01 мая 2020

В Pytorch веса параметров модели транспонированы до применения операции matmul к входной матрице. Вот почему размеры матрицы весов перевернуты и отличаются от ожидаемых; то есть вместо того, чтобы быть [784, 256], вы заметите, что это [256, 784].

Вы можете увидеть исходную документацию Pytorch для nn.Linear, где мы имеем:

...

self.weight = Parameter(torch.Tensor(out_features, in_features))

...

def forward(self, input):
        return F.linear(input, self.weight, self.bias)

При рассмотрении реализации F.linear мы видим соответствующую строку, которая умножает входную матрицу на transpose весовой матрицы:

output = input.matmul(weight.t())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...