张量(tensor)与向量(vector)的维度
如果我给出一个元组(7,8,9),凭借我们的数学直觉,我们一眼就看出他是一个向量,代表着在三维空间中的一个有向线段,但是如果我给出的是一个数组a=[7,-8,9],这显然是一个长度等于3的数组,因为我们想声明这个数组时肯定是先int arr[3] = {7,-8,9};//C,这显然是一个一维度数组,那么它到底是几维的?如果你对这个问题产生了疑惑,本文可能会提供一些帮助。
如果我给出一个元组(7,8,9),凭借我们的数学直觉,我们一眼就看出他是一个三维向量,代表着在三维空间中的一个有向线段,但是如果我给出的是一个数组a=[7,-8,9],这显然是一个长度等于3的一维数组,因为我们想声明这个数组时肯定是先int arr[3] = {7,-8,9};//C,这显然是一个一维度数组,那么它到底是几维的?如果你对这个问题产生了疑惑,本文可能会提供一些帮助。
张量与向量的概念
张量
张量是一个多维数组,它是数学和计算机科学中的一个重要概念。张量可以包含零个或多个维度,并且每个维度可以有任意数量的元素。思考张量要从多维空间中取思考。
在数学中,张量是向量和矩阵的一般化概念。它可以表示在多维空间中的数据或对象,并且可以进行各种数学运算。
在计算机科学中,张量是一种数据结构,广泛应用于数据科学、机器学习和深度学习等领域。张量可以存储和处理多维数据,例如图像、音频、文本、时间序列等。
注意:张量可以存储和处理多维数据,所以简单来说可以把张量看作数据的“容器”
张量的阶数(或称为秩)表示张量的维度数量。例如,零阶张量是一个标量(scalar),一阶张量是向量(vector),二阶张量是矩阵(matrix),三阶及以上的张量称为高阶张量或多维张量。
所以三维张量=三阶张量=张量的秩等于三,他们都表示这个“容器”是建立在三维空间上的容器,几维空间就由几个线性无关的轴来定位,容器中的每个元素都有一个三维坐标[x][y][z],来确定元素在每一个轴上的位置
每个维度都有一个大小,表示该维度上的元素数量。例如,一个二维张量可以有 shape (3, 4),表示该张量有 3 行和 4 列。
维度的大小代表容器的形状
需要注意的是,张量的元素可以是任何类型的数据,例如数值、字符串、布尔值等,具体取决于应用场景和需要。
向量
向量是数学和物理学中的一个概念,它表示一个有大小和方向的量。在计算机科学中,向量也被广泛应用于数值计算、图形学、机器学习等领域。对向量的理解同样要建立在多维空间上。
在数学中,向量可以表示为有序的元素集合,通常以列向量或行向量的形式呈现。一个向量具有以下特征:
1. 大小(或长度):向量的大小表示向量的模或长度,用 ||v|| 或 |v| 表示。对于 n 维向量 v = [v1, v2, ..., vn],其大小计算公式为 √(v1^2 + v2^2 + ... + vn^2)。
2. 方向:向量的方向指向量在空间中的朝向。在多维空间中,向量的方向通常用与轴的夹角来表示
3. 维度:向量的维度表示向量的元素数量。例如,一个三维向量表示该向量存在于三维空间中,向量中的三个数字分别代表向量在三个坐标轴方向上的分量。
4. 元素:向量的元素是组成向量的各个分量。这些分量可以是实数、复数或其他类型的数值。
维度是认知中的维度,变的是描述事情的方法
综上,对[7,8,9]怎么分析要具体去看它到底是一个向量还是一个张量
如果他是一个向量:
那么从存储形式上讲:
向量以一维张量的形式存储([7,-8,9]),这个一维度,说的是容器的维度
从元素意义上来讲,向量中的每个元素代表这个向量它在各个维度上分量的长度与方向(正负),所以这是一个三维向量,在三个坐标轴上的分量是7,-8,9
如果他是一个张量,那他就是一个一维张量,可以理解为一个一位数组存储的三个数7,-8,9
在我们的书写中,如果目标在于符合数学形式语言的的严谨,应当尽可能的描述为“ (3,10,10) 维度的张量”,而不是“三维张量”
Pytorch中的操作
pytorch中以tensor表示张量,以一维张量的模式表示向量,在代码中的dim都是指张量的维度,下面以二维张量为例子,先创建一个二维张量
import torch
import torch.nn as nn
m = torch.tensor([[0.,1.,2.],[2.,3.,4.],[2.,6.,7.],[2.,9.,1.]])
print(m)
print(m.shape)
print(m.mean(dim=0))
print(m.mean(dim=1))
输出结果是
tensor([[0., 1., 2.],
[2., 3., 4.],
[2., 6., 7.],
[2., 9., 1.]])
torch.Size([4, 3])
tensor([1.5000, 4.7500, 3.5000])
tensor([1., 3., 5., 4.])
dim=0是列,dim=1是行,人工看的时候先找框在再框里数数字,先看的是低0维度,后数的维度数位次+=1,按列求平均结果自然有三个数,按照行求平均结果自然有四个数
下面再来看三维张量的情况,首先创建一个三维张量
import torch
import torch.nn as nn
m = torch.tensor([[[0.,1.,2.],[2.,3.,4.],[2.,6.,7.],[2.,9.,1.]],[[0.,1.,2.],[2.,3.,4.],[2.,6.,7.],[2.,9.,1.]],[[0.,1.,2.],[2.,3.,4.],[2.,6.,7.],[2.,9.,1.]]])
print(m)
print(m.shape)
print(m.mean(dim=0))
print(m.mean(dim=1))
print(m.mean(dim=2))
输出的结果是
tensor([[[0., 1., 2.],
[2., 3., 4.],
[2., 6., 7.],
[2., 9., 1.]],
[[0., 1., 2.],
[2., 3., 4.],
[2., 6., 7.],
[2., 9., 1.]],
[[0., 1., 2.],
[2., 3., 4.],
[2., 6., 7.],
[2., 9., 1.]]])
torch.Size([3, 4, 3])
tensor([[0., 1., 2.],
[2., 3., 4.],
[2., 6., 7.],
[2., 9., 1.]])
tensor([[1.5000, 4.7500, 3.5000],
[1.5000, 4.7500, 3.5000],
[1.5000, 4.7500, 3.5000]])
tensor([[1., 3., 5., 4.],
[1., 3., 5., 4.],
[1., 3., 5., 4.]])
通过下图应该不难理解:
原三维张量的尺寸是(3,4,3)
如果对dim=0求平均,去除第0维度尺寸,所得平均张量的尺寸就是(4,3),原张量第1维度成为平均张量第0维度,原第2维度成为平均张量第1维度
如果对dim=1求平均,去除第1维度尺寸,所得平均张量的尺寸就是(3,3),原张量第0维度成为平均张量第0维度,原第2维度成为平均张量第1维度
如果对dim=2求平均,去除第2维度尺寸,所得平均张量的尺寸就是(3,4),原张量第0维度成为平均张量第0维度,原第1维度成为平均张量第1维度
这个操作可以比作切片,有的细心读者可能会对平均矩阵的方向(有的会看出输出的镜像)与些问题,这是由于看的方向不对,平均张量的维度0和维度1应该像下图一样
参考文章
向量与张量“维度”的理解 - 鸭鸭要专心一点的文章 - 知乎
https://zhuanlan.zhihu.com/p/625177771
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)