pytorch线性方法中的多维输入?

Eka*_*Eka 0 perceptron neural-network deep-learning pytorch

在构建简单的感知器神经网络时,我们通常将格式输入的二维矩阵传递给二维权(batch_size,features)重矩阵,类似于numpy 中的这个简单神经网络。我一直假设神经网络的感知器/密集/线性层只接受 2D 格式的输入并输出另一个 2D 输出。但是最近我遇到了这个 pytorch 模型,其中一个 Linear 层接受一个 3D 输入张量并输出另一个 3D 张量 ( 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())
Run Code Online (Sandbox Code Playgroud)

这些是我的问题,

  1. 上述神经网络是否有效?那就是模型是否会正确训练?
  2. 即使在传递 3D input 之后x = torch.randn(10,3,4),为什么 pytorchnn.Linear也没有显示任何错误并给出 3D 输出?

Sha*_*hai 8

较新版本的 PyTorch 允许nn.Linear接受 ND 输入张量,唯一的限制是输入张量的最后一个维度将等于in_features线性层。然后将线性变换应用于张量的最后一个维度。
例如,如果in_features=5out_features=10并且输入张量的x维度为 2-3-5,则输出张量的维度为 2-3-10。


seb*_*ckm 5

如果您查看文档,您会发现该Linear层确实接受任意形状的张量,其中只有最后一个维度必须与in_features您在构造函数中指定的参数匹配。

输出将具有与输入完全相同的形状,只有最后一个维度会更改为您out_features在构造函数中指定的任何内容。

它的工作方式是将相同的层(具有相同的权重)应用于(可能的)多个输入中的每一个。在您的示例中,您有一个输入形状,(10, 3, 4)其基本上是一组10 * 3 == 304 维向量。因此,您的图层a1a2应用于所有这 30 个向量以生成另一个10 * 3 == 304D 向量作为输出(因为您out_features=4在构造函数中指定)。

所以,回答你的问题:

上述神经网络是否有效?那就是模型是否会正确训练?

是的,它是有效的,它将从技术观点“正确”训练。但是,与任何其他网络一样,这是否真的能正确解决您的问题是另一个问题。

即使在传递 3D 输入 x = torch.randn(10,3,4) 之后,为什么 pytorch nn.Linear 没有显示任何错误并提供 3D 输出?

好吧,因为它被定义为以这种方式工作。