Python 多维张量的感知器

Python 多维张量的感知器,python,pytorch,perceptron,Python,Pytorch,Perceptron,我正试图使用感知器将一个大小为:[1,24768]的张量缩减为另一个大小为[1,1768]的张量。我唯一可以使用的方法是首先将输入张量重塑为[1,1,24*768],然后将其通过线性层。我想知道,除了使用RNN,是否还有一种更优雅的转换方式,因为我不想使用RNN。对于我想要进行的转换,通常还有其他方法吗?以下是我执行上述操作的代码: lin = nn.Linear(24*768, 768) # x is in shape of [1, 24, 768] # out is in shape of

我正试图使用感知器将一个大小为:
[1,24768]
的张量缩减为另一个大小为
[1,1768]
的张量。我唯一可以使用的方法是首先将输入张量重塑为
[1,1,24*768]
,然后将其通过线性层。我想知道,除了使用RNN,是否还有一种更优雅的转换方式,因为我不想使用RNN。对于我想要进行的转换,通常还有其他方法吗?以下是我执行上述操作的代码:

lin = nn.Linear(24*768, 768)

# x is in shape of [1, 24, 768]
# out is in shape of [1, 1, 768]
x = x.view(1,1,-1)
out = lin(x)

如果广播是困扰您的问题,您可以使用

>>> m = nn.Sequential(
...    nn.Flatten(),
...    nn.Linear(24*768, 768))

>>> x = torch.rand(1, 24, 768)

>>> m(x).shape
torch.Size([1, 768])
如果你真的想要额外的尺寸,你可以解开
轴=1上的张量:

>>> m(x).unsqueeze(1).shape
torch.Size([1, 1, 768])

这是使用线性层的方法,但您应该将其重塑为[1,24*768],我想,我不明白为什么要保留三维。这种方法有什么问题吗?@trialNerror正确。这就是我这么做的原因,我不认为这是错的(我没有说那是错的)。我只是想知道是否有其他方法(除了我所做的)来进行这种转换。这听起来非常正确。我也这样做了:比如将输入张量展平,然后将其传递给感知。我只是想知道其他的方法。有没有其他方法(除了我使用的--您建议的)来进行此转换?我已经为您提供了另一种方法,我不确定您所说的其他方法是什么意思?我想你在找短一点的吗?只有通过
nn.Linear
…正确的方法才能实现完全连接的层。事实上,我上面发布的方法是将输入张量展平,然后使用线性层进行转换(与您建议的相同)。对于其他方法,我指的是其他可以完成这种转换的常用方法。例如,我知道进行这种转换的一种方法是对输入张量的元素进行平均,然后将得到的张量传递给线性层(有些人就是这样做的)。我将你的答案标记为“接受”,因为我认为当人们想要进行这种转换时,平坦化是最常见的事情。如果你采用全球平均值,你就不会执行相同的操作:它将忽略向量中的任何空间信息,而FC层将考虑所有可能的组合。输入张量是一些包含上下文的句子的表示形式。因此,一些人在NLP领域通常做的是平均所有这些表示,以获得文档的表示(即句子序列)。这就是为什么我对这些张量取了一个全局平均值,将它从[1,24768]的形状减少到[1,1768]。