【Pytorch学习】- 3 - 一些基本概念

本篇为学习笔记,多为网络其他博主的介绍搬运合成,如有雷同,皆为我搬运,用于记录学习的概念,特此声明!

1. Tensor

张量是多维度数组的意思,是标量、向量、矩阵的高位扩展

2.Tensor 与 Variable

Variable 的属性:

  • data: 被包装的 Tensor。
  • grad: data 的梯度。
  • grad_fn: 创建 Tensor 所使用的 Function自动求导的关键,因为根据所记录的函数才能计算出导数。
  • requires_grad: 指示是否需要梯度,并不是所有的张量都需要计算梯度。
  • is_leaf: 指示是否叶子节点(张量)
  • dtype: 张量的数据类型,如 torch.FloatTensor,torch.cuda.FloatTensor。
  • shape: 张量的形状。如 (64, 3, 224, 224)
  • device: 张量所在设备 (CPU/GPU),GPU 是加速计算的关键
  • dtype,PyTorch 提供了 9 种数据类型、共分为 3 大类3.
    9-种类3-大类float16-bit
    32-bit
    64-bit
    integerinsigned-8-bit
    8-bit
    16-bit
    32-bit
    64-bit
    BooleanBoolean

3. Tensor 创建的方法

3.1 直接创建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: 是否存于锁页内存

 3.2 从numpy创建tensor

这种凡是创建的tensor会与原来的ndarray共享内存,意味着修改其中的一个数据,另一个也会被更改;

arr = np.array([[2,2,2], [6,6,6]])
t = torch.from_numpy(arr)

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

 

 

arr = np.array([[2,2,2], [6,6,6]])
t = torch.from_numpy(arr)

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

 

 

3.3 根据数值创建

 3.3.1根据size创建全0张量

torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • size: 张量的形状
  • out: 输出的张量,如果指定了 out,那么torch.zeros()返回的张量和 out 指向的是同一个地址
  • layout: 内存中布局形式,有 strided,sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。
  • device: 所在设备,cuda/cpu
  • requires_grad: 是否需要梯度

3.3.2 根据input的形状创建全0张量

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

3.3.3 根据自定义数值创建张量

torch.full

torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • size: 张量的形状,如 (M,N)
  • fill_value: 张量中每一个元素的值
t1 = torch.full((M,N),x)

 创建等差的 1 维张量: torch.arange()

torch.arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

【注意】区间为[start, end)

  • start: 数列起始值
  • end: 数列结束值,开区间,取不到结束值
  • step: 数列公差,默认为

创建均分的1D张量:torch.linspace()

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

数值区间为 [start, end]

  • start: 数列起始值
  • end: 数列结束值
  • steps: 数列长度 (元素个数)

 

创建对数均分的1D张量:torch.logspace()

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

数值区间为 [start, end],底为 base。

  • start: 数列起始值
  • end: 数列结束值
  • steps: 数列长度 (元素个数)
  • base: 对数函数的底,默认为 10

创建单位对对角矩阵:torch.eye()

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

创建单位对角矩阵( 2 维张量),默认为方阵

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

3.3.4 根据自定义数值创建张量

正态分布(高斯):torch.normal()

torch.normal(mean,std,*,generator=None,out=None)
四种模型mean标量代码示例:# mean:标量 std: 标量 # 这里需要设置 size t_normal = torch.normal(0., 1., size=(4,))
std标量
mean标量 # mean:张量 std: 标量
mean = torch.arange(1, 5, dtype=torch.float)
std = 1
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)
std张量
mean张量
std标量
mean张量# mean:张量 std: 张量
mean = torch.arange(1, 5, dtype=torch.float)
std = torch.arange(1, 5, dtype=torch.float)
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)
std张量

生成标准正态分布 torch.randn() 和 torch.randn_like()

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

生成 区间 [0, 1) 上生成均匀分布:torch.rand() 和 torch.rand_like()

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

在区间 [low, high) 上生成整数均匀分布 :torch.randint() 和 torch.randint_like()

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

 生成从 0 到 n-1 的随机排列:torch.randperm()

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

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

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

参考资料

知乎专栏

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值