【问题标题】:Confused Regarding PyTorch GRU Docs对 PyTorch GRU 文档感到困惑
【发布时间】:2021-04-06 21:21:30
【问题描述】:

这可能是一个太基本的问题,但是文档中的 GRU 输入需要是 3 维是什么意思? PyTorch 状态的 GRU 文档:

输入形状(seq_len,batch,input_size):张量包含 输入序列的特征。输入也可以是打包的 变长序列。看 torch.nn.utils.rnn.pack_padded_sequence() 了解详情。

https://pytorch.org/docs/stable/generated/torch.nn.GRU.html

假设我正在尝试预测序列中的下一个 # 并拥有以下数据集:

n, label
1, 2
2, 3
3, 6
4, 9
...

如果我在猜测下一个输入时使用前两个输入对数据进行窗口化,则数据集变为:

t-2, t-1, t, label
na, na, 1, 2
na, 1, 2, 3
1, 2, 3, 6
2, 3, 4, 10
...

其中 t-x 仅表示使用先前时间步的输入值。

因此,在创建顺序加载器时,它应该为第 1、2、3、6 行创建以下张量:

inputs: tensor([[1,2,3]]) #shape(1,3)
labels: tensor([[6]])     #shape(1,1)

我目前将输入形状理解为(# 个批次,每个批次的 # 个特征) 输出形状为(# 个批次,每批次有 # 个输出特征)

我的问题是,输入张量是否应该看起来像:

tensor([[[1],[2],[3]]])

代表(# 个批次,#prior 要考虑的输入,每个输入的#features)

我想我最好尝试理解为什么在 PyTorch 中 GRU 的输入具有 3 个维度。第三维从根本上代表什么?如果我有一个像上面这样的转换数据集,如何正确地将它传递给模型。

编辑: 所以现在的模式是:

1 + 1 = 2
2 + 1 = 3
3 + 2 + 1 = 6
4+ 3 + 2 + 1 = 10

我希望 t-2、t-1 和 t 代表用于帮助猜测的每个时间步的特征。例如,在每个时间点都可能有 2 个特征。维度将是(1 个批量大小、3 个时间步长、2 个特征)。

我的问题是 GRU 是否采用扁平化输入:

(1 batch size, 3 time steps * 2 features per time step)

或未展平的输入:

(1 batch size, 3 time steps, 2 features per timestep)

我目前的印象是这是第二个输入,但想检查一下我的理解。

【问题讨论】:

  • 你能告诉我如何用 3 个双特征向量表示这个序列:[1, 2, 3]

标签: python python-3.x machine-learning pytorch lstm


【解决方案1】:

我想通了。本质上,序列长度为 3 意味着系统的输入需要为:[[[1],[2],[3]], [[2], [3], [4]]]大小为 2,序列长度为 3,每个时间步长为 1 的特征输入。本质上,每个序列都是某个时间 t 的输入。

【讨论】:

  • input_size=0,但老实说,我怀疑您的模型是否能够在不对数据进行编码的情况下进行学习。看:4 > 3 > 2 > 1,在你的输入中有顺序,4 最大的输入将优先于所有其他。
【解决方案2】:

nn.GRU 模块与其他 PyTorch RNN 模块一样工作。如果参数batch_first 设置为True,它需要一个三维张量(seq_len, batch, input_size)(batch, seq_len, input_size)。我认为最后一个维度让你感到困扰。

您解释说您的序列设置如下:

t-2 t-1 t label
na na 1 2
na 1 2 3
1 2 3 6
2 3 4 10

您缺少的是输入编码:您将如何表示您的预测和标签?像这样喂整数是行不通的。您可能需要将数据转换为 one-hot-encodings。

想象一下有 10 个不同的标签,即你的词汇表是由 10 个元素组成的。转换为单热编码是一个简单的过程。取一个长度为词汇量大小的零向量,并将 1 放在与特定标签对应的索引处。

词汇量依次为...input_size。给定一个label,它看起来像:

encoding = torch.zeros(input_size)
encoding[label] = 1
label one-hot-encoding
0 [1,0,0,..., 0, 0]
1 [0,1,0,..., 0, 0]
... ...
9 [0,0,0,..., 0, 1]

因此,您的训练点(输入序列1, 2, 3标签6)将转换为(输入序列[[0,1,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,0,0,0]]标签6)。这是二维的,为批次添加了额外的维度(见第一节),这就是三个。

我故意保留标签原样,因为 PyTorch 损失函数(例如 nn.CrossEntropyLoss)通常需要索引而不是目标的一次性编码(//标签)。

【讨论】:

  • 我编辑了我的问题以更好地说明我的困惑。
  • 我想你不太明白我在这里试图解释的内容,你必须对你的输入进行编码。编码将确定您的input_size,即您的 GRU 输入的dim=2。只有这样你才能选择你的序列长度,这里你的序列是[t-2, t-1, t]seq_length=3,你必须编码成一个形状(3, 10)。反过来,您的 GRU 输入具有三个维度。请解释是什么困扰着您,或者某些部分是否不清楚。
  • 我想通了。本质上,.3的序列长度意味着系统的输入需要是:[[[1],[2],[3]], [[2], [3], [4]]]批量大小为 2,序列长度为 3,每个时间步长的特征输入为 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2020-01-02
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多