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)
这些是我的问题,
x = torch.randn(10,3,4)
,为什么 pytorchnn.Linear
也没有显示任何错误并给出 3D 输出?如果您查看文档,您会发现该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 没有显示任何错误并提供 3D 输出?
好吧,因为它被定义为以这种方式工作。
归档时间: |
|
查看次数: |
10607 次 |
最近记录: |