我有一个(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]
。
答案 0 :(得分:3)
否
您需要了解reshape
/ view
和permute
之间的区别。
reshape
和view
仅更改张量的“ 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)并对其应用了变换功能。由于您的新张量具有数组的特征,因此这将在代码中造成严重的问题。 希望你明白我的意思。