PyTorch高维张量通过线性层
PyTorch high-dimensional tensor through linear layer
我在 PyTorch 中有一个大小为 (32, 128, 50) 的张量。这些是批大小为 32 的 50 维词嵌入。也就是说,我的大小中的三个索引对应于批数、最大序列长度(使用 'pad' 标记)和每个嵌入的大小。现在,我想通过线性层传递它以获得大小为 (32, 128, 1) 的输出。也就是说,对于每个序列中嵌入的每个单词,我想让它成为一维的。我尝试在我的网络中添加一个线性层,从 50 维到 1 维,我的输出张量具有所需的形状。所以我认为这可行,但我想了解 PyTorch 如何处理这个问题,因为我没有明确告诉它要将线性层应用到哪个维度。我玩了一下,发现:
- 如果我输入一个形状为 (32, 50, 50) 的张量——因此通过线性层可以应用到的两个维度(两个 50s)产生歧义——它只将它应用到最后一个dim 并给出形状为 (32, 50, 1) 的输出张量。
- 如果我输入一个形状为 (32, 50, 128) 的张量,它不会输出形状为 (32, 1, 128) 的张量,而是给我一个错误。
这表明 PyTorch 中的线性层将转换应用于张量的最后一个维度。是这样吗?
在nn.Linear
docs中指定该模块的输入可以是大小为(*, H_in)
的任意张量,输出将是大小为[=12的张量=],其中:
*
表示任意维数
H_in
是in_features
的个数
H_out
是out_features
的个数
为了更好地理解这一点,对于大小为 (n, m, 50)
的 tensor
可以由具有 in_features=50
的 Linear
模块处理,而 tensor
大小 (n, 50, m)
可以由具有 in_features=m
的 Linear
模块处理(在您的情况下 128
)。
我在 PyTorch 中有一个大小为 (32, 128, 50) 的张量。这些是批大小为 32 的 50 维词嵌入。也就是说,我的大小中的三个索引对应于批数、最大序列长度(使用 'pad' 标记)和每个嵌入的大小。现在,我想通过线性层传递它以获得大小为 (32, 128, 1) 的输出。也就是说,对于每个序列中嵌入的每个单词,我想让它成为一维的。我尝试在我的网络中添加一个线性层,从 50 维到 1 维,我的输出张量具有所需的形状。所以我认为这可行,但我想了解 PyTorch 如何处理这个问题,因为我没有明确告诉它要将线性层应用到哪个维度。我玩了一下,发现:
- 如果我输入一个形状为 (32, 50, 50) 的张量——因此通过线性层可以应用到的两个维度(两个 50s)产生歧义——它只将它应用到最后一个dim 并给出形状为 (32, 50, 1) 的输出张量。
- 如果我输入一个形状为 (32, 50, 128) 的张量,它不会输出形状为 (32, 1, 128) 的张量,而是给我一个错误。
这表明 PyTorch 中的线性层将转换应用于张量的最后一个维度。是这样吗?
在nn.Linear
docs中指定该模块的输入可以是大小为(*, H_in)
的任意张量,输出将是大小为[=12的张量=],其中:
*
表示任意维数H_in
是in_features
的个数
H_out
是out_features
的个数
为了更好地理解这一点,对于大小为 (n, m, 50)
的 tensor
可以由具有 in_features=50
的 Linear
模块处理,而 tensor
大小 (n, 50, m)
可以由具有 in_features=m
的 Linear
模块处理(在您的情况下 128
)。