目录
- [1. view/reshape](#1. view/reshape)
- [2. squeeze/unsqueeze](#2. squeeze/unsqueeze)
- [3. expand 扩展](#3. expand 扩展)
- [4. repeat](#4. repeat)
- [5 .t转置](#5 .t转置)
- [6. transpose](#6. transpose)
- [7. permute](#7. permute)
1. view/reshape
view(*shape) → Tensor
作用:类似于reshape,将tensor转换为指定的shape,原始的data不改变。返回的tensor与原始的tensor共享存储区。返回的tensor的size和stride必须与原始的tensor兼容。每个新的tensor的维度必须是原始维度的子空间,或满足以下连续条件:
式1 张量连续性条件
否则需要先使用contiguous()方法将原始tensor转换为满足连续条件的tensor,然后就可以使用view方法进行shape变换了。或者直接使用reshape方法进行维度变换,但这种方法变换后的tensor就不是与原始tensor共享内存了,而是被重新开辟了一个空间。
torch.reshape(input, shape) → Tensor
与view方法类似,将输入tensor转换为新的shape格式。
但是reshape方法更强大,可以认为a.reshape = a.view() + a.contiguous().view()。
即:在满足tensor连续性条件时,a.reshape返回的结果与a.view()相同,否则返回的结果与a.contiguous().view()相同。
view/reshape的问题是会丢失维度信息,比如变化后的数据[4,784],而通过它是推不出原来的shape是[4,1,28*28]的,必须额外保存维度信息。
2. squeeze/unsqueeze
unsqueeze增加维度,索引>=0时在索引之前插入,索引<0时,在索引之后插入
unsqueeze只改变维度不改变数据本身
实际应用的例子
squeeze减少维度,减少掉维度为1的维度,不输入参数时,它会减少掉所有能减掉的维度
3. expand 扩展
用于将张量中单数维的数据扩展到指定的size
只有维度是1的才可以扩展,当expand参数为-1时,保持原来的维度不扩展,负数其他值无意思。且扩展的Tensor不会分配新的内存,只是原来的基础上创建新的视图并返回,返回的张量内存是不连续的。类似于numpy中的broadcast_to函数的作用。如果希望张量内存连续,可以调用contiguous函数。
4. repeat
和expand()作用类似,均是将tensor扩展到新的形状
前文提及expand仅能作用于单数维,那对于非单数维的拓展,那就需要借助于repeat函数了。
tensor.repeat(sizes)参数 sizes指定了原始张量在各维度上复制的次数。整个原始张量作为一个整体进行复制,这与Numpy中的repeat函数截然不同,而更接近于tile函数的效果。
与expand不同,repeat函数会真正的复制数据并存放于内存中。repeat开辟了新的内存空间,torch.repeat返回的张量在内存中是连续的
5 .t转置
用于二维及以下的tensor转置
6. transpose
transpose方法的作用是交换矩阵的两个维度,transpose(dim0, dim1) → Tensor,transpose可能导致数据不连续,可调用.contiguous使数据变的连续
7. permute
torch.permute(input, dims) → Tensor
按照dims给定的dimension排列顺序,返回Tensor
t只用于二维及以下的tensor转置,transpose能操作2D矩阵的转置,在多维矩阵可以进行二维的转置,permute可对任意高维矩阵进行转置