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

时间:2020-05-10 04:17:20

标签: python tensorflow pytorch reshape tensor

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

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

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

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

我需要像这样重塑形状,因为介于两者之间的模型将产生形状为[8, 5, 300]的输出,并且下一层将输入接受为[5, 300, 8]

2 个答案:

答案 0 :(得分:3)

您需要了解reshape / viewpermute之间的区别。

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]

答案 1 :(得分:2)

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