作者(文火冰糖的硅基工坊)

 


目录

第1章 Tensor运算概述

1.1 概述

1.3 张量的操作与变换

1.4 环境准备

1.5 张量的操作 - 拼接与堆叠

第2章 增加张量长度的拼接:cat()

2.2 函数说明

2.3 代码示例

第3章 增加张量维度的拼接:stack()

 3.1 基本原理

2.2 函数说明

2.3 代码示例


第1章 Tensor运算概述

1.1 概述

PyTorch提供了大量的张量运算,基本上可以对标Numpy多维数组的运算,以支持对张量的各种复杂的运算。

这些操作运算中大多是对数组中每个元素执行相同的函数运算,并获得每个元素函数运算的结果序列,这些序列生成一个新的同维度的数组。

https://www.runoob.com/numpy/numpy-linear-algebra.html

[PyTroch系列-14]:PyTorch基础 - 张量的操作 - 拼接与堆叠_深度学习

 

 不同维度张量的维度方向标识

[PyTroch系列-14]:PyTorch基础 - 张量的操作 - 拼接与堆叠_Pytorch_02

  • 随着张量维度的增加,张量维度的标识dim的范围也在扩宽
  • 在张量维度扩展的过程中,维度标识值(dim=n)的含义也在发生变化。
  • dim=0总是指向张量的多维数组存储的最外层:[ ] [ ] [ ], 这与物理存储的标识是相反的。

1.2 运算分类

[PyTroch系列-14]:PyTorch基础 - 张量的操作 - 拼接与堆叠_拼接_03

(1)算术运算:加、减、系数乘、系数除

(2)函数运算:sin,cos

(3)取整运算:上取整、下取整

(4)统计运算:最大值、最小值、均值

(5)比较运算:大于,等于,小于、排序

(6)线性代数运算:矩阵、点乘、叉乘

 

1.3 张量的操作与变换

[PyTroch系列-14]:PyTorch基础 - 张量的操作 - 拼接与堆叠_拼接_03

(1)变换内容: 变换张量元素的值。

(1)变换长度:变换张量的某个方向的长度(即向量的维度或长度),长度可增加,可减少。

(3)变换维度:变化张量的维度,维度可以增加,可减少。

 

1.4 环境准备

import numpy as np
import torch
 
print("Hello World")
print(torch.__version__)
print(torch.cuda.is_available())

 

1.5 张量的操作 - 拼接与堆叠

[PyTroch系列-14]:PyTorch基础 - 张量的操作 - 拼接与堆叠_深度学习_05

张量的拼接有两种主要的基本策略:

  • 不增加张量的维度,只增加某个维度方向的长度:cat()
  • 增加张量的维度,不增加单个维度方向的长度:stack()

 

第2章 增加张量长度的拼接:cat()

2.1 基本原理

[PyTroch系列-14]:PyTorch基础 - 张量的操作 - 拼接与堆叠_堆叠_06

2.2 函数说明

功能:在不改变张量维度的情况下,通过增加张量在某个维度方向的长度,把两个张量拼接起来。

原型:cat(input, dim)

输入参数:

input: 输入张量

dim:拼接的方向

2.3 代码示例

 (1)按照dim =0 的方向拼接

# 张量的拼接:阶数不变,增加dim方向的长度
a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)

print("\n按照dim=0方向拼接")
c = torch.cat((a,b),dim=0)
print(c)
print(c.shape)

输出:

源张量
tensor([[1., 1., 1., 1.],
        [2., 2., 2., 2.],
        [3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
        [5., 5., 5., 5.],
        [5., 5., 5., 5.]])
torch.Size([3, 4])

按照dim=0方向拼接
tensor([[1., 1., 1., 1.],
        [2., 2., 2., 2.],
        [3., 3., 3., 3.],
        [4., 4., 4., 4.],
        [5., 5., 5., 5.],
        [5., 5., 5., 5.]])
torch.Size([6, 4])

(2)按照dim=1的方向进行拼接

# 张量的拼接:增加阶数,
a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)

print("\n按照dim=0方向拼接:扩展阶数")
c = torch.stack((a,b),dim=0)
print(c)
print(c.shape)

输出:

源张量
tensor([[1., 1., 1., 1.],
        [2., 2., 2., 2.],
        [3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
        [5., 5., 5., 5.],
        [5., 5., 5., 5.]])
torch.Size([3, 4])

按照dim=1方向拼接
tensor([[1., 1., 1., 1., 4., 4., 4., 4.],
        [2., 2., 2., 2., 5., 5., 5., 5.],
        [3., 3., 3., 3., 5., 5., 5., 5.]])
torch.Size([3, 8])

第3章 增加张量维度的拼接:stack()

 3.1 基本原理

stack堆叠,可以增加一个维度,因此案例中dim=0,1,2 三种情形,在三种方向进行堆叠。

(1)按照dim = 0的方向堆叠

[PyTroch系列-14]:PyTorch基础 - 张量的操作 - 拼接与堆叠_Pytorch_07

 

(2)按照dim = 1的方向堆叠

[PyTroch系列-14]:PyTorch基础 - 张量的操作 - 拼接与堆叠_深度学习_08

 

(3)按照dim = 2的方向堆叠

[PyTroch系列-14]:PyTorch基础 - 张量的操作 - 拼接与堆叠_深度学习_09

2.2 函数说明

功能:通过增加张量维度,把两个张量堆叠起来,堆叠后,维度增加1.

原型:stack(input, dim)

输入参数:

input: 输入张量

dim:拼接的方向,这里的dim是指拼接后张量的dim,而不是原张量的dim

 

2.3 代码示例

(1)dim=0的方向

# 张量的拼接:增加阶数,
a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)

print("\n按照dim=0方向拼接:扩展阶数")
c = torch.stack((a,b),dim=0)
print(c)
print(c.shape)

输出:

源张量
tensor([[1., 1., 1., 1.],
        [2., 2., 2., 2.],
        [3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
        [5., 5., 5., 5.],
        [5., 5., 5., 5.]])
torch.Size([3, 4])

按照dim=0方向拼接:扩展阶数
tensor([[[1., 1., 1., 1.],
         [2., 2., 2., 2.],
         [3., 3., 3., 3.]],

        [[4., 4., 4., 4.],
         [5., 5., 5., 5.],
         [5., 5., 5., 5.]]])
torch.Size([2, 3, 4])

(2)dim=1的方向

a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)

print("\n按照dim=1方向拼接:扩展阶数")
c = torch.stack((a,b),dim=1)
print(c)
print(c.shape)

输出:

 

源张量
tensor([[1., 1., 1., 1.],
        [2., 2., 2., 2.],
        [3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
        [5., 5., 5., 5.],
        [5., 5., 5., 5.]])
torch.Size([3, 4])

按照dim=1方向拼接:扩展阶数
tensor([[[1., 1., 1., 1.],
         [4., 4., 4., 4.]],

        [[2., 2., 2., 2.],
         [5., 5., 5., 5.]],

        [[3., 3., 3., 3.],
         [5., 5., 5., 5.]]])
torch.Size([3, 2, 4])

 

(3)dim=2的方向

a = torch.Tensor([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = torch.Tensor([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量")
print(a)
print(a.shape)
print(b)
print(b.shape)

print("\n按照dim=2方向拼接:扩展阶数")
c = torch.stack((a,b),dim=2)
print(c)
print(c.shape)

输出:

源张量
tensor([[1., 1., 1., 1.],
        [2., 2., 2., 2.],
        [3., 3., 3., 3.]])
torch.Size([3, 4])
tensor([[4., 4., 4., 4.],
        [5., 5., 5., 5.],
        [5., 5., 5., 5.]])
torch.Size([3, 4])

按照dim=2方向拼接:扩展阶数
tensor([[[1., 4.],
         [1., 4.],
         [1., 4.],
         [1., 4.]],

        [[2., 5.],
         [2., 5.],
         [2., 5.],
         [2., 5.]],

        [[3., 5.],
         [3., 5.],
         [3., 5.],
         [3., 5.]]])
torch.Size([3, 4, 2])