首页 > 解决方案 > 将编码器输出传递到全连接层

问题描述

我有一个基于 LSTM 的编码器,其最终隐藏状态维度为[2, 1, 1024]. 这里,2 是层数,1 是批量大小,1024 是隐藏大小。我试图将编码形式传递到一个完全连接的层来训练分类器。

问题是torch.nn.Linear输入的形式(N,∗,Hin)是 N 是批量大小,Hin 是隐藏大小。鉴于没有提及输入中的层数,我如何重塑编码器的输出torch.nn.Linear

标签: pythonpytorchlstm

解决方案


例如,您可以获取 RNN 的最后一步输出并将其馈送到完全连接的网络中。这将是选择张量的最后一个元素的问题。在这种情况下,第一个密集层将总共有hidden_size神经元。在这种情况下,密集层的输入将具有(1, out_features)since的形状batch_size=1。就像是:

>>> fc = nn.Linear(1024, 512) # for demonstration purposes
>>> x, _ = lstm(x)

>>> fc(x[-1:, 0]).shape
(1, 1024)

或者,您也可以输入整个张量。正如您所描述的,它nn.Linear适用于多维张量。在这种情况下,我们推断的是 RNN 的整个输出,而不仅仅是它的最后一步输出:

>>> fc = nn.Linear(1024, 512) # for demonstration purposes
>>> x, _ = lstm(x)

>>> fc(x).shape
(2, 1, 512)

但请注意,第二个维度(此处为 size 1)将仍然是您的批处理轴。如果您不希望以这种方式使用它并且更喜欢将其打开,则可以使用该选项axis=0进行初始化。你也可以置换和...nn.LSTMbatch_first=Trueaxis=0axis=1

要回答您的问题,无需将层数提供给nn.Linear,它会自动展平除最后一个(特征维度)之外的所有维度,并将输出重新整形为相应的形状。


推荐阅读