线性代数
在pytorch中使用线性代数处理数据
source code: NJU-ymhui/DataOperations: Use pytorch for data operations (github.com)
use git to clone: https://github.com/NJU-ymhui/DataOperations.git
linear_algebra.py tensor_operation.py
基本概念
轴
**张量的每一个轴对应数据的一个维度。**轴的编号从0开始;轴的编号指明了张量的某个方向。
示例:一个二维张量可以视作一个矩阵,它有两个轴:行(轴-0)与列(轴-1)
维度
此处的维度描述的是张量这个宏观概念。
维度是张量的一个属性,指的是张量的数据结构在各个方向上的扩展性。例如,一个二维张量(矩阵)有两个维度,三维张量有三个维度,以此类推。维度可以理解为张量的形状的一部分,描述了张量在每个方向上的大小。例如,形状为 (2, 3, 4)
的三维张量有 3 个维度。
注意区分轴与维度的概念:维度是描述张量形状的,而轴是进行张量操作时用来指定方向的。可以把维度看作是描述张量结构的属性,而轴是对这些属性进行操作的工具。
形状
**张量的形状是一个表示每个轴大小的元组。**例如,一个形状为 (3, 4)
的二维张量有 3 行和 4 列。
标量
在pytorch
中,标量由只有一个元素的张量表示,当然也可以进行代数运算。
code
def scalar(): |
output
tensor(3) tensor(2.5000) tensor(1.) |
注:x = torch.tensor(3)与x = torch.tensor([3])表达不同的语义,前者生成的是一个标量(虽然是以张量的形式表示),而后者生成的的的确确是一个只有一个元素的一维张量
向量
向量可以被视作由标量组成的列表,在pytorch
中,向量由一维张量表示。
和原生python
一样可以用下标索引访问向量中的元素(在数据操作一文中有介绍)
长度、维度
pytorch
中的张量提供了size()和shape属性来获取向量(一维张量)的长度、维度(因为向量一定只有一个
code
def vector(): |
output
tensor([0, 1, 2, 3]) |
矩阵
正如向量是标量的推广,矩阵是向量的推广,可以看作是向量的组合。
通过reshape()
方法可以将一个一维张量重塑成多维张量,自然可以形成矩阵。
code
def matrix(): |
output
tensor([[ 0, 1, 2, 3], |
张量
现在我们要正式介绍张量的概念了。正如向量是标量的推广,矩阵是向量的推广,张量可以看作是对矩阵的推广,将数据送上更高的维度,拥有更多的轴。
code
def tensor(): |
output
3 * 4 * 5: |
pytorch中张量算法的性质
clone()方法
张量的clone()
方法会分配一个新内存,并完全拷贝被克隆张量的内容
code
def clone(): |
output
memory same? |
张量乘
张量的乘法*
是按元素乘(数据操作里有讲)
code
def multiply(): |
output
tensor([[0, 1], |
与标量运算
一个张量与一个标量运算,效果为张量的每个元素都与标量做一次运算
code
def tensor_with_scalar(): |
output
tensor([[0, 1, 2], |
降维
求和
可以通过var.sum(...)
方法求张量中所有元素的和
默认情况下求和会把张量中所有元素都加在一起,使其退化为一个标量,但也可以指定张量沿哪一个轴来求和降维,通过axis
参数。
code
def sum_reduce_dim(): |
output
tensor([[ 0, 1, 2, 3, 4], |
求平均
可以通过var.mean()
方法求所有元素的平均值,与sum
同理,也可以指定沿哪个轴求均值。
注:求均值的张量元素期望为浮点或复数类型
code
def mean(): |
output
tensor([[ 0., 1., 2., 3., 4.], |
非降维求和
有时我们希望求完和或均值后的张量保持轴数,可以使用keepdims
参数来实现。通过这种方法得到的按某个轴求得的和或均值轴数不变,就可以利用广播机制与原张量进行运算。
如果我们想沿某个轴计算张量中元素的累积总和,比如axis=0
(按行计算),可以调用cumsum()
函数。此函数不会沿任何轴降低输入张量的维度。
code
def keep_dims(): |
output
mat: |
点积
两个向量之间可以进行点积,使用torch.dot(...)
方法可以在向量间使用点积;根据点积的定义也可以先对向量做按元素乘法,然后再计算总和。
code
def dot_product(): |
output
tensor([0, 1, 2, 3]) |
矩阵乘法
矩阵-向量积
即用一个矩阵矩阵乘一个向量:A~mn~x~n~,注意矩阵的列(轴-1)要与向量的维数一致
torch.mv(...)
:实现矩阵乘向量
code
def matrix_mul_vector(): |
output
tensor([[ 0, 1, 2, 3], |
矩阵-矩阵积
A~mn~B~nk~,注意左矩阵的列(轴-1)要和右矩阵的行(轴-0)一致
torch.mm(...)
:实现矩阵乘矩阵(仅二维张量也就是矩阵)
torch.matmul(...)
:实现任意维度张量乘法
code
def matrix_mul_matrix(): |
output
tensor([[ 0, 1, 2, 3], |
范数
通俗的来讲,范数反映出一个向量的大小。常见的范数计算方法有L1
范数和L2
范数两种。
L~1~
向量元素的绝对值和
code
def L1(): |
output
tensor([ 1, -2, 3, -4]) |
L~2~
向量与线性空间原点的距离(有点类似距离公式),深度学习中更常使用L~2~范数
torch.norm(...)
:计算L~2~范数,注意张量元素要是浮点或复数类型
code
def L2(): |
output
tensor([ 1., -2., 3., -4.]) |
L~p~范数
矩阵的L~2~范数
矩阵的Frobenius范数定义为矩阵所有元素的平方和的平方根。
code
def matrix_l2(): |
output
tensor([[ 0., 1., 2.], |
(•‿•)