Я хотел бы создать модель PyTorch, которая берет на себя внешний продукт входных данных, а затем выполняет линейную регрессию. В качестве примера рассмотрим входной вектор [1,2,3]
, тогда я бы хотел вычислить w
и b
для оптимизации [1*1, 1*2, 1*3, 2*1, 2*2, 2*3, 3*1, 3*2, 3*3] @ w + b
.
Для пакета input
с r
строками и c
столбцов, я могу сделать это в PyTorch с
(input.reshape(r,c,1) @ input.reshape(r,1,c)).reshape(r,c**2) @ weigts + b
Моя проблема в том, что он чрезвычайно медленный. Как в 1000 раз медленнее и потребляет больше памяти, чем при добавлении полностью подключенного слоя c*c RELU, даже если он имеет такое же количество весов.
Мой вопрос: почему это происходит?
Является ли reshape
очень дорогой операцией для PyTorch? Могу ли я переформулировать это по-другому, что сделало бы вещи более эффективными?
Другая эквивалентная формулировка, которую я знаю, это torch.diag(input @ weights @ input.T) + b
, но теперь мы вычисляем намного больше значений, чем нам нужно (r*r
), только чтобы бросить их снова прочь.