Tensor基础3——张量的索引与变形
1. 张量的索引操作
- 在操作张量时,经常要去获取某些元素进行处理或者修改操作,在这里需要了解torch中的索引操作。
准备数据:
1 |
|
1)简单行列索引的使用
1 |
|
2)列表索引的使用
1 |
|
3)范围索引的使用
1 |
|
4)布尔索引的使用
1 |
|
5)多维索引的使用
1 |
|
2. 张量的形状操作
有重塑、堆叠、挤压和解压:
方法 | 单行描述 |
---|---|
torch.reshape(input, shape) | 重塑 input 到 shape (如果兼容),也可以使用 torch.Tensor.reshape()。 |
tensor.view(shape) | 返回不同 shape 中的原始张量视图,但与原始张量共享相同的数据。 |
tensor.contiguous() | 将张量转换到整块内存上 |
torch.stack(tensors, dim=0) | 沿着新的维度(dim)连接 tensors 的序列,所有 tensors 必须具有相同的大小。 |
torch.squeeze(input) | 挤压 input 以移除值为 1 的所有尺寸。 |
torch.unsqueeze(input, dim) | 返回在 dim 处添加了维度值 1 的 input。 |
torch.transpose(input,dim1,dim2) | 实现交换张量形状的指定维度 |
torch.permute(input, dims) | 返回原始 input 的视图,其尺寸被置换(重新排列)为 dims。 |
深度学习模型(神经网络)都是以某种方式操纵张量。由于矩阵乘法的规则,如果形状不匹配,就会遇到错误。这些方法可帮助您确保张量的正确元素与其他张量的正确元素混合。
举例说明:
1 |
|
1)RESHAPE
reshape 函数可以在保证张量数据不变的前提下改变数据的维度,将其转换成指定的形状。
使用 torch.reshape()
增加一个维度。
1 |
|
使用 torch.reshape()
改变张量的形状。
1 |
|
2)VIEW / CONTIGUOUS
- view 函数也可以用于修改张量的形状,只能用于存储在整块内存中的张量。
- 在 PyTorch 中,有些张量是由不同的数据块组成的,它们并没有存储在整块的内存中,view 函数无法对这样的张量进行变形处理。例如: 一个张量经过了 transpose 或者 permute 函数的处理之后,就无法使用 view 函数进行形状操作。
- 此时需要先使用 contiguous 函数转换为整块内存的张量,再使用 view 函数。
1 |
|
3)STACK
如果想将新张量堆叠五次,使用 torch.stack()
来实现。
1 |
|
4)SQUEEZE / UNSQUEEZE
squeeze 函数删除形状为 1 的维度(降维),unsqueeze 函数添加形状为1的维度(升维)。
1 |
|
5)TRANSPOSE/ PERMUTE
transpose 函数可以实现交换张量形状的指定维度, 例如: 一个张量的形状为 (2, 3, 4) 可以通过 transpose 函数把 3 和 4 进行交换, 将张量的形状变为 (2, 4, 3) 。 permute 函数可以一次交换更多的维度。
1 |
|
6)总结
<1> reshape 函数可以在保证张量数据不变的前提下改变数据的维度
<2> squeeze 和 unsqueeze 函数可以用来增加或者减少维度
<3> transpose 函数可以实现交换张量形状的指定维度, permute 可以一次交换更多的维度
<4> view 函数也可以用于修改张量的形状, 但是它要求被转换的张量内存必须连续,所以一般配合 contiguous 函数使用
3. 张量的拼接操作
- torch.cat()
1 |
|
Tensor基础3——张量的索引与变形
https://linxkon.github.io/Tensor基础3--张量的索引与变形.html