【发布时间】:2021-10-19 11:32:14
【问题描述】:
我有一个基于 LSTM 的编码器,其最终隐藏状态维度为 [2, 1, 1024]。这里,2 是层数,1 是批量大小,1024 是隐藏大小。我正在尝试将编码形式传递到一个全连接层来训练分类器。
问题在于torch.nn.Linear 以(N,∗,Hin) 的形式接受输入,其中 N 是批量大小,Hin 是隐藏大小。鉴于torch.nn.Linear 的输入中没有提及层数,我如何重塑编码器的输出?
【问题讨论】:
我有一个基于 LSTM 的编码器,其最终隐藏状态维度为 [2, 1, 1024]。这里,2 是层数,1 是批量大小,1024 是隐藏大小。我正在尝试将编码形式传递到一个全连接层来训练分类器。
问题在于torch.nn.Linear 以(N,∗,Hin) 的形式接受输入,其中 N 是批量大小,Hin 是隐藏大小。鉴于torch.nn.Linear 的输入中没有提及层数,我如何重塑编码器的输出?
【问题讨论】:
例如,您可以获取 RNN 的最后一步输出并将其馈送到全连接网络。这将是选择张量的最后一个元素的问题。在这种情况下,第一个密集层将总共有hidden_size 个神经元。在这种情况下,密集层的输入将具有(1, out_features) 的形状,因为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)
但请注意,第二个维度(此处大小为 1)将保留您的批处理轴。如果您不希望以这种方式使用它并且更喜欢在axis=0 上使用它,您可以使用batch_first=True 选项初始化您的nn.LSTM。你也可以置换axis=0 和axis=1...
要回答您的问题,无需将层数提供给nn.Linear,它会自动展平除最后一个(特征维度)以外的所有维度,并将输出重新整形为相应的形状。
【讨论】: