【问题标题】:What is the purpose of having the same input and output in PyTorch nn.Linear function?在 PyTorch nn.Linear 函数中具有相同输入和输出的目的是什么?
【发布时间】:2023-01-26 04:53:26
【问题描述】:

我认为这是一个理解问题,但我将不胜感激任何帮助。 我正在尝试学习如何使用 PyTorch 进行自动编码。在nn.Linear函数中,有两个指定的参数, nn.Linear(input_size, hidden_size)

当将张量重塑为其最小有意义的表示时,就像在自动编码中所做的那样,hidden_​​size 会更小是有意义的。然而,在 PyTorch 教程中有一行指定相同的 input_size 和 hidden_​​size:

class NeuralNetwork(nn.Module):
def __init__(self):
    super(NeuralNetwork, self).__init__()
    self.flatten = nn.Flatten()
    self.linear_relu_stack = nn.Sequential(
        nn.Linear(28*28, 512),
        nn.ReLU(),
        nn.Linear(512, 512),
        nn.ReLU(),
        nn.Linear(512, 10),
    )

我想我的问题是,具有相同输入和隐藏大小的目的是什么?这不会返回一个相同的张量吗?

我怀疑这只是调用 nn.ReLU() 激活函数后的一个要求。

【问题讨论】:

  • 我认为这更像是一种设计选择。

标签: machine-learning pytorch neural-network autoencoder activation-function


【解决方案1】:

正如维基百科所说:

自动编码器是一种用于学习的人工神经网络 未标记数据的有效编码。这 通过尝试重新生成编码来验证和改进编码 来自编码的输入。

换句话说,自动编码器的想法是学习一个身份。这个身份函数将仅针对特定输入进行学习(即没有异常)。由此,得出以下几点:

  1. 输入与输出具有相同的维度
  2. 自动编码器(通常)是为了学习输入的基本特征而构建的

    由于第 (1) 点,自动编码器将具有一系列层(例如一系列 nn.Linear()nn.Conv())。 由于第 (2) 点,您通常有一个压缩信息的编码器(作为您的 code-sn-p,您从 28x28 开始到结尾的 10)和一个解压缩信息的解码器(10 -> 28x28)。通常,在该理论架构的多个实现中,潜在空间维度 (10) 远小于输入 (28x28)。既然编码器部分的最终目标很明确,您可能会明白压缩过程中可能会产生额外的数据(nn.Linear(28*28, 512)),当一系列层给出最终输出 (10) 时,它将消失。

【讨论】:

  • 啊,这很有道理,谢谢你的回答。
【解决方案2】:

请注意,由于您问题中的模型在线性层之后包含非线性,因此该模型不会学习输入和输出之间的恒等变换。在 relu 非线性的特定情况下,模型可以如果所有输入值都是正数,则学习恒等变换,但通常情况并非如此。

如果我们有一个由 Linear --> Sigmoid --> Linear 组成的更小的模型,我发现更容易想象这个问题。在这种情况下,输入将通过第一个矩阵变换进行映射,然后“压缩”到空间 [0, 1] 中作为“隐藏”层表示。下一个(“输出”)层将需要采用这种压缩的输入视图,并想出某种方法将其“解压”回原始状态。但是对于仿射输出层,这是不可能的,因此模型将不得不为两个矩阵学习一些其他的非恒等式变换。

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 2020-03-23
    • 1970-01-01
    • 2019-11-11
    • 2018-05-15
    • 2019-07-21
    • 2013-12-07
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多