Tensor张量介绍

Tensor的概念

Tensor的中文为张量,张量的意思是一个多维数组,其实标量、向量、矩阵的高维扩展。
变量可以称为0维张量,向量可以称为1维张量,矩阵可以称为2维张量。RGB图像可以称为3维张量。在这里,可以把张量看作多维数组。

Tensor和Variable

在Pytorch4.0之前,torch.autograd包中存在Variable这种数据类型,主要用于封装Tensor,进行自动求导,Variable主要包含下面几种属性。

  • data被封装的Tensor
  • grad data的梯度
  • grad_fn: 创建Tensor所使用的function 是自动求导的关键,因为根据所记录的函数才能计算出导数。
  • requires_grad: 指示是否需要梯度,并不是所有的张量都需要计算梯度。
  • is_leaf: 指示是否叶子节点(张量),叶子节点的概念在计算图中会用到,后面会详细介绍。
    在Pytorch0.4之后,Variable并入了Tensor,在之后的版本Tensor中,除了具有上面Variable的5个属性,还有下面3个属性。
  • dtype: 张量的数据类型,如 torch.FloatTensor,torch.cuda.FloatTensor。
  • shape:张量的形状,如 (64, 3, 224, 224)
  • device:张量所在的设备(GPU|CPU),GPU是加速计算的关键.
    关于dtype,Pytorch共提供了9中数据类型,共分为3大类,float (16-bit, 32-bit, 64-bit)、integer (unsigned-8-bit ,8-bit, 16-bit, 32-bit, 64-bit)、Boolean。模型参数和数据用的最多类型是float-32-bit。label 常用的类型是 integer-64-bit。

Tensor创建方法

直接创建Tensor

orch.tensor()

torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)
  • data 数据,可以是list和numpy。
  • dtype: 数据类型,默认与data一致
  • device:所在设备,cuda和cpu
  • requires_grad: 是否需要梯度
  • pin_memory:是否存于锁页内存。
    代码示例

```python
arr = np.ones((3, 3))
print("ndarray的数据类型:", arr.dtype)
# 创建存放在 GPU 的数据
# t = torch.tensor(arr, device='cuda')
t= torch.tensor(arr)
print(t)
### torch.from_numpy(ndarray)
从numpy中创建tensor,利用这个**方面创建的tensor和原来的ndarray共享内存**,当修改其中一个数据,另一个也会被改动。

```python
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)

# 修改 array,tensor 也会被修改
# print("\n修改arr")
# arr[0, 0] = 0
# print("numpy array: ", arr)
# print("tensor : ", t)

# 修改 tensor,array 也会被修改
print("\n修改tensor")
t[0, 0] = -1
print("numpy array: ", arr)
print("tensor : ", t)

根据数值创建Tensor

torch.zeros()

torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:根据size创建全0张量。

  • size:张量的形状
  • out:输出张量,如果指定了out,那么torch.zeros()返回的张量和out指向同一地址
  • layout:内存中布局形式,有 strided,sparse_coo 等,当时稀疏矩阵时,置为 sparse_coo 可以减少内存占用。
  • device:所在设备,cuda/cpu
  • requires_grad: 是否需要梯度
out_t = torch.tensor([1])
# 这里制定了 out
t = torch.zeros((3, 3), out=out_t)
print(t, '\n', out_t)
# id 是取内存地址。最终 t 和 out_t 是同一个内存地址
print(id(t), id(out_t), id(t) == id(out_t))

torch.zeros_like

torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False, memory_format=torch.preserve_format)
  • 根据输入形状input,创建全0向量。
  • input:创建与input同形状的全0向量。
  • dtype:数据类型
  • layout:内存中的布局形式,有 strided,sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。
  • 同理还有全1张量创建方法。torch.ones(),torch.ones_like()

torch.full(),torch.full_like()

torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建自定义数值向量

  • size :向量的形状
  • fill_value: 张量中每一个元素的值
t = torch.full((3, 3), 1)
print(t)

torch.arange()

torch.arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • 功能:创建等差1的张量
  • start: 数列起始值
  • end: 数列结束值,开区间,取不到结束值
  • step: 数列公差,默认为 1

torch.linspace()

torch.linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建均分的 1 维张量。数值区间为 [start, end]

  • start: 数列起始值
  • end: 数列结束值
  • steps: 数列长度 (元素个数)
# t = torch.linspace(2, 10, 5)
t = torch.linspace(2, 10, 6)
print(t)

torch.logspace()

torch.logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

创建对数均分的 1 维张量。数值区间为 [start, end],底为 base。

  • start: 数列起始值
  • end: 数列结束值
  • steps: 数列长度 (元素个数)
  • base: 对数函数的底,默认为 10
# t = torch.logspace(2, 10, 5)
t = torch.logspace(2, 10, 6)
print(t)

torch.eye()

torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建单位对焦矩阵,( 2 维张量),默认为方阵

  • n: 矩阵行数。通常只设置 n,为方阵。
  • m: 矩阵列数

根据概率创建Tensor

torch.normal()

torch.normal(mean, std, *, generator=None, out=None)

功能:生成正态分布

  • mean 为均值
  • std为标准差

torch.randn() 和 torch.randn_like()

torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:生成标准正态分布

torch.rand() 和 torch.rand_like()

torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:在区间[0,1]上生成均匀分布。

torch.randint() 和 torch.randint_like()

randint(low=0, high, size, *, generator=None, out=None,
dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:功能:在区间 [low, high) 上生成整数均匀分布。

在这里插入代码片

torch.randperm()

torch.randperm(n, out=None, dtype=torch.int64, layout=torch.strided, device=None, requires_grad=False)

功能:生成从 0 到 n-1 的随机排列。常用于生成索引。

torch.bernoulli()

torch.bernoulli(input, *, generator=None, out=None)

功能::以 input 为概率,生成伯努利分布 (0-1 分布,两点分布)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

big_matster

您的鼓励,是给予我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值