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)
----> 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
属性。
# 演⽰叶⼦Tensor与grad,backward的关系
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 Tensor的grad属性由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


发布评论