То, что вы видите, это не (out_dim, in_dim), это просто форма матрицы весов.Когда вы звоните print(model)
, вы видите, что функции ввода и вывода правильны:
RNN(
(dense1): Linear(in_features=12, out_features=100, bias=True)
(dense2): Linear(in_features=100, out_features=100, bias=False)
(dense3): Linear(in_features=12, out_features=100, bias=True)
(dense4): Linear(in_features=100, out_features=100, bias=False)
(dense5): Linear(in_features=100, out_features=6, bias=True)
)
Вы можете проверить исходный код, чтобы увидеть, что веса на самом деле транспонированы перед вызовом matmul
.
nn.Linear
определяется здесь:
https://pytorch.org/docs/stable/_modules/torch/nn/modules/linear.html#Linear
Вы можете проверить forward
, это выглядит так:
def forward(self, input):
return F.linear(input, self.weight, self.bias)
F.linear
здесь определено:
https://pytorch.org/docs/stable/_modules/torch/nn/functional.html
Соответствующиелиния для умножения весов:
output = input.matmul(weight.t())
Как уже упоминалось выше, вы можете видеть, что весов транспонированы перед применением matmul
и, следовательно, формавес отличается от того, что вы ожидали.
Итак, если вы хотите выполнить умножение матриц вручную, вы сделаете:
# dummy input of length 5
input = torch.rand(5, 12)
# apply layer dense1 (without bias, for bias just add + model.dense1.bias)
output_first_layer = input.matmul(model.dense1.weight.t())
print(output_first_layer.shape)
Так же, как вы ожидаете от вашего dense1
, он возвращает:
torch.Size([5, 100])
Надеюсь, это объясняет ваши наблюдения формой:)