2023年11月29日发(作者:)

TORCH01-02:Tensor的基本属性

本主题主要说明Tensor的属性及其使⽤;这些属性的设置,影响着数据的使⽤;Tensor最⼤的好处就是提供了计算跟

踪,这个跟踪⽤来提供动态图的构建,这个与Tensorflow的静态图是不同滴。同时还提供了导数的逆向计算,这是⽬前

神经⽹络中最成功的⽹络思想:前馈神经⽹络的实现基础(梯度下降算法);

回顾

因为Torch的核⼼是Tensor,Tensor的数据由Storage管理,所以这两个类的关系搞清楚,就可以使⽤Tensor了。

Tensor的Python构造器定义如下

Tensor.__init__( device)

Tensor.__init__(e storage)

数据进出

3. 数学运算

构建数据对象的最终⽬的就是计算;

计算的类别很多,基本数学运算,随机采样,线性代数的矩阵运算,统计计算,......

这⾥先明⽩基本的数学运算。

Tensor的官⽅⽂档结构

torch

Tensors

Creation Ops

Linear Algebra Package,底层使⽤的也是BLAS;

3. ATLAS

Automatically Tuned Linear Algebra Software;

4. OpenBLAS:

在编译时根据⽬标硬件进⾏优化,⽣成运⾏效率很⾼的程序或者库。OpenBLAS的优化是在编译时进⾏的,所以其运⾏效率⼀般

⽐ATLAS要⾼。因此OpenBLAS对硬件的依赖⽐较⾼,换⼀个硬件平台可能会重新进⾏编译。

5. cuBLAS与ACML:

Intel的MKL和AMD的ACML都是在BLAS的基础上,针对⾃⼰特定的CPU平台进⾏针对性的优化加速。以及NVIDIA针对GPU开

发的cuBLAS。

tensor([1, 2, 3, 4, 5])

tensor([[1, 5],

[2, 6],

[3, 7],

[4, 8]])

属性-data

调⽤backward计算导数,导数是累加的。如果每次单独计算,需要清空;

导数的计算需要导数函数grad_fn(没有指定函数的张量⽆法计算导数)。

grad_fn函数⾃动跟踪,需要设置requires_grad=True

1. grad属性

es_grad=True

es_grad=True

t4 = t1 + t2

print(t4)

print(_fn)

print(type(_fn))

print(es_grad)

print(_fn)

tensor([5.], grad_fn=)

True

None

print()

rd()

---------------------------------------------------------------------------

RuntimeError Traceback (most recent call last)

in ()

----> 1 t3 = ([2.5], device=('cuda'))

2 print(_cuda) # 苹果电脑不⽀持,请在Nvidia的显卡上运算,其他⽀持GPU运算的电脑上运⾏

RuntimeError: legacy constructor for device type: cpu was passed device type: cuda, but device type must be: cpu

# 判定电脑是否之处GPU运算

print(_available())

False

属性-is_leaf,grad与retain_grad函数

这个属性⽤来判定张量Tensor是否是Leaf Tensor,下⾯两种情况都应该是Leaf Tensor:

属性requires_grad为False的。

属性requires_grad=True,但是⽤户构建的Tensor,表⽰该张量不是计算结果,⽽是⽤户构建的初始张量。

运⾏backward后,仅仅只有Leaf Tensor在才会有grad属性。如果⾮Leaf Tensor需要具有grad属性,需要使⽤retain_grad函数开启grad

属性。

# 演⽰叶⼦Tensorgradbackward的关系

import torch

t1 = ([1.0]) # ⽤户构建的都是Leaf Tensor

es_grad=True

t2 = ([2.0])

es_grad=True

t3 = t1 + t2

rd()

print(_leaf, _leaf, _leaf)

print() # Leaf Tensorgrad属性由backward函数产⽣。

# 演⽰Non-Leaf Tensor retain_grad的关系

import torch

t1 = ([1.0]) # ⽤户构建的都是Leaf Tensor

es_grad=True

t2 = ([2.0])

es_grad=True

t3 = t1 + t2

_grad() # 调⽤该函数后,t3才有grad属性,可以注释这个语句体验

rd()

print(_leaf, _leaf, _leaf)

print()

True True False

tensor([1.])

属性-ndim与dim函数

Tensor的维度

import torch

t1 = ([1.0, 20]) # ⽤户构建的都是Leaf Tensor

t2 = (

[

[2.0, 1.0],

[1.0, 2.0]

]

)

([2, 2])

([2, 2])

属性-is_sparse

是否稀疏张量:

在矩阵中,若数值为0的元素数⽬远远多于⾮0元素的数⽬,并且⾮0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若⾮0元素

数⽬占⼤多数时,则称该矩阵为稠密矩阵。定义⾮零元素的总数⽐上矩阵所有元素的总数为矩阵的稠密度。

is_sparse该属性是只读,不可写的

稀疏张量提供专门的API产⽣。

稀疏张量有⾃⼰的构造规则:

稀疏张量被表⽰为⼀对致密张量:⼀维张量和⼆维张量的索引。可以通过提供这两个张量来构造稀疏张量,以及稀疏张量的⼤⼩。

False

False

False

tensor([[1., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

...,

[0., 0., 0., ..., 0., 0., 0.],

d d

属性-output_nr

在反向传播中存放输出。

具体⽤途先存疑。

import torch

t1 = ([0, 0]) # ⽤户构建的都是Leaf Tensor

t2 = (

[

[1, 0],

[0, 0]

]

)

print(_nr)

0

# 演⽰Non-Leaf Tensor retain_grad的关系

import torch

t1 = ([2.0]) # ⽤户构建的都是Leaf Tensor

es_grad=True

# 演⽰Non-Leaf Tensor retain_grad的关系

import torch

t1 = ([2.0]) # ⽤户构建的都是Leaf Tensor

es_grad=True

t2 = ([2.0])

es_grad=True

t3 = t1 + t2

print(_mkldnn)

print()

print(_quantized)

False

None

False