【问题标题】:Passing encoder output into fully connected layer将编码器输出传递到全连接层
【发布时间】:2021-10-19 11:32:14
【问题描述】:

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

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

【问题讨论】:

    标签: python pytorch lstm


    【解决方案1】:

    例如,您可以获取 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=0axis=1...

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

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2017-12-14
      • 2019-05-04
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 2016-06-07
      相关资源
      最近更新 更多