Многомерные входы в pytorch Линейный метод? - PullRequest
0 голосов
/ 28 октября 2019

При построении простой нейронной сети персептрона мы обычно передаем 2D матрицу ввода в формате (batch_size,features) в 2D весовую матрицу, аналогично этой простой нейронной сети в numpy . Я всегда предполагал, что слой Перцептрон / Плотный / Линейный нейронной сети принимает только вход 2D-формата и выводит другой 2D-вывод. Но недавно я натолкнулся на эту модель pytorch, в которой линейный слой принимает трехмерный входной тензор и выводит другой трехмерный тензор (o1 = self.a1(x)).

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.a1 = nn.Linear(4,4)
        self.a2 = nn.Linear(4,4)
        self.a3 = nn.Linear(9,1)
    def forward(self,x):
        o1 = self.a1(x)
        o2 = self.a2(x).transpose(1,2)
        output = torch.bmm(o1,o2)
        output = output.view(len(x),9)
        output = self.a3(output)
        return output

x = torch.randn(10,3,4)
y = torch.ones(10,1)

net = Net()

criterion = nn.MSELoss()
optimizer = optim.Adam(net.parameters())

for i in range(10):
    net.zero_grad()
    output = net(x)
    loss = criterion(output,y)
    loss.backward()
    optimizer.step()
    print(loss.item())

Это мой вопрос,

  1. Является ли вышеуказанная нейронная сеть действительной? то есть будет ли модель работать правильно?
  2. Даже после прохождения 3D-ввода x = torch.randn(10,3,4), почему Pytorch nn.Linear не показывает никакой ошибки и выдает 3D-вывод?

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Более новые версии PyTorch позволяют nn.Linear принимать входной тензор ND, единственным ограничением является то, что последнее измерение входного тензора будет равно in_features линейного слоя. Затем к последнему измерению тензора применяется линейное преобразование.
Например, если in_features=5 и out_features=10 и входной тензор x имеет размеры 2-3-5, то выходной тензор будет иметь размеры2-3-10.

1 голос
/ 28 октября 2019

Если вы посмотрите на документацию , вы обнаружите, что действительно слой Linear принимает тензоры произвольной формы, где только последнее измерение должно совпадать с аргументом in_features, который вы указали вконструктор.

Выход будет иметь точно такую ​​же форму, как и вход, только последнее измерение изменится на то, что вы указали в конструкторе out_features.

Это работает таким образомчто один и тот же слой (с одинаковыми весами) наносится на каждый из (возможно) нескольких входов. В вашем примере у вас есть входная форма (10, 3, 4), которая в основном представляет собой набор 10 * 3 == 30 4-мерных векторов. Итак, ваши слои a1 и a2 применяются ко всем этим 30 векторам, чтобы сгенерировать еще один 10 * 3 == 30 4D векторов в качестве выходных данных (поскольку вы указали out_features=4 в конструкторе).

Итак,чтобы ответить на ваши вопросы:

Является ли вышеуказанная нейронная сеть действительной? То есть будет ли модель обучаться правильно?

Да, она действительна и будет обучена «правильно» из технической точки зрения. Но, как и в любой другой сети, если это действительно правильно решит вашу проблему, это другой вопрос.

Даже после прохождения 3D-входа x = torch.randn (10,3,4), почемуPytorch nn.Linear не показывает никаких ошибок и выдает трехмерный вывод?

Ну, потому что он определен для работы таким образом.

...