重塑张量是否保留原始张量的特征?

Does reshaping a tensor retain the characteristics of original tensor?

我有一个形状为 (8, 5, 300) 的张量 T,其中 8 是批量大小,5 是每批中的文档数,300 是每个文档的编码。如果我按如下方式重塑张量,我的张量的属性是否保持不变?

T = T.reshape(5, 300, 8)
T.shape
>> Size[5, 300, 8]

那么,这个新张量是否指示与原始张量相同的属性?通过属性,我的意思是,我可以说这也是一个批量大小为 8 的 Tensor,每个批次有 5 个文档,每个文档有 300 维编码吗?

这会影响模型的训练吗?如果张量的重塑弄乱了数据点,那么训练就没有意义了。例如,如果像上面那样重塑输出,则输出为一批 5 个样本,每个样本有 300 个大小为 8 的文档。如果发生这种情况,那就没用了,因为我没有 300 个文件,也没有 5 个样本的批次。

我需要像这样重塑它,因为我中间的模型产生形状 [8, 5, 300] 的输出,而下一层接受 [5, 300, 8] 的输入。

你需要明白reshape/view and permute.

的区别

reshapeview 只改变张量的“shape”,没有重新排序元素。因此

orig = torch.rand((8, 5, 300))
resh = orig.reshape(5, 300, 8)

orig[0, 0, :] != resh[0, :, 0]  

如果你也想改变元素的顺序,你需要permute它:

perm = orig.permute(1, 2, 0)
orig[0, 0, :] == perm[0, :, 0]

不! 我犯了类似的错误。 想象一下,您将二维张量(矩阵)转换为一维张量(数组)并对其应用变换功能。这会在代码中造成严重问题,因为您的新张量具有数组的特征。 希望你明白我的意思。