PyTorch中的Tensor

Tensor 与 Variable

Variable

torch.autograd.Variable()

Variable 是torch.autograd中的数据类型(但目前已并入Tensor), 主要用于封装tensor, 进行自动求导

  • data: 被包装的tensor
  • grad: data 的梯度
  • grad_fn: 创建Tensor的Function(加法,乘法等), 是自动求导的关键
  • requires_grad: 指示是否需要梯度
  • is_leaf: 指示是否是叶子结点(张量)

Tensor

PyTorch0.4.0版开始,Variable并入Tensor

  • data, grad, grad_fn, requires_grad, is_leaf 同上
  • dtype:张量的数据类型,如torch.FloatTensor(32位), torch.cuda.FloatTensor
  • shape: 张量的形状, 如(64, 3, 255, 255)
  • device: 张量所在设备, GPU/CPU

Tensor的创建

一:直接创建

1.1 torch.tensor()

torch.tensor(
			data,
			dytpe=None,
			device=none,
			requires_grad=False,
			pin_memory=False)

功能: 从data创建tensor

参数:

  • data: 数据,可以是list, numpy
  • dtype: 数据类型, 默认与data一致
  • device: 所在设备, cuda/cpu
  • requires_grad: 是否需要梯度
  • pin_memory: 是否存于锁页内存
import torch
import numpy as np

# 通过torch.tensor 创建张量
flag = True
if flag:
    arr = np.ones((3, 3))
    print('ndarry的数据类型: ', arr.dtype)
    t1 = torch.tensor(arr, device='cuda')
    t2 = torch.tensor(arr)
    print('t1=', t1)
    print('t2=', t2)
    
>>>
ndarry的数据类型:  float64
t1= tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], device='cuda:0', dtype=torch.float64)
t2= tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)

‘cuda:0’: 0是因为本地只有1个GPU

1.2 torch.from_numpy()

torch.from_numpy(ndarray)

功能: 从numpy创建tensor

注意事项: 从tensor.from_numpy创建的tensor与原ndarray共享内存, 当修改其中一个的数据,另一个也将被改动

flag = True
if flag:
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    t = torch.from_numpy(arr)
    print('numpy array: ', arr)
    print('tensor: ', t)
    
    print('\n修改arr')
    arr[0, 0] = 0
    print('numpy array: ', arr)
    print('tensor: ', t)
    
    print('\n修改tensor')
    arr[0, 0] = -1
    print('numpy array: ', arr)
    print('tensor: ', t)
    # arr 和 t 的地址不同
    print(id(arr) == id(t))
>>>
numpy array:  [[1 2 3]
 [4 5 6]]
tensor:  tensor([[1, 2, 3],
        [4, 5, 6]], dtype=torch.int32)

修改arr
numpy array:  [[0 2 3]
 [4 5 6]]
tensor:  tensor([[0, 2, 3],
        [4, 5, 6]], dtype=torch.int32)

修改tensor
numpy array:  [[-1  2  3]
 [ 4  5  6]]
tensor:  tensor([[-1,  2,  3],
        [ 4,  5,  6]], dtype=torch.int32)
False

二、依据数值创建

2.1 torch.zeros()

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

功能: 依size创建全0张量
参数:

  • size: 张量的形状, 如(3, 3), (3, 224, 224)
  • out: 输出的张量
  • layout: 内存中布局形式, 有strided, sparse_coo(稀疏张量时设置,可以提供效率)等
  • device: 所在设备, gpu/cpu
  • requires_grad: 是否需要梯度
# 通过torch.zeros 创建张量

flag = True
if flag:
    out_t = torch.tensor([1])
    print('out_t: ', out_t)
    # t和out_t是同一个数据, out将torch。zeros生成的张量t赋给了out_t
    t = torch.zeros((3, 3), out=out_t)
    
    print('out_t: ', out_t)
    print('t: ', t)
    print('id(out_t): ', id(out_t))
    print('id(t): ', id(t))
    print(id(out_t) == id(t))
>>>
out_t:  tensor([1])
out_t:  tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
t:  tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
id(out_t):  2227084130560
id(t):  2227084130560
True

2.2 torch.zeros_like()

torch.zeros_like(input, 
				dtype=None,
				layout=None,
				device=None,
				requires_grad=False)

功能: 依input形状创建全0张量
参数:

  • input: 创建与input同形状的全0张量
  • dtype: 数据类型
  • layout: 内存中的布局形式

2.3 torch.ones()

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

2.4 torch.ones_like()

torch.ones_like(input,
				dtype=None, 
				layout=None,
				device=None, 
				require_grad=False)

功能: 依input形状创建全1张量
参数

  • size: 张量的形状, 如(3, 3), (3, 224, 224)
  • input: 创建与input同形状的全1张量
  • dtype: 数据类型
  • layout: 内存中的布局形式
  • requires_grad: 是否需要梯度

2.5 torch.full()

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

功能: 依input创建全fill_valu的值
参数

  • size:张量的形状, 如(3, 3)
  • fill_value: 张量的值
flag = True
if flag:
    t = torch.full((3, 3), 5)
    print(t)
>>>
tensor([[5., 5., 5.],
        [5., 5., 5.],
        [5., 5., 5.]])

2.6 torch.full_like()

2.7 torch.arange()

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

功能: 创建等差的1维张量
注意事项: 数值区间为[start, end)
参数:

  • start: 数列起始值
  • end: 数列结束值, 取不到
  • step: 数列公差, 默认为1
flag = True
if flag:
    # 创建一个偶数列
    t = torch.arange(0, 10, 2)
    print(t)
>>>
tensor([0, 2, 4, 6, 8])

2.8 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: 数列长度
flag = True
if flag:
    t = torch.linspace(0, 10, 5)
    print(t)
>>>
tensor([ 0.0000,  2.5000,  5.0000,  7.5000, 10.0000])

2.9 torch.logspace()

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

功能: 创建对数均分的1维张量
注意事项: 长度为steps, 底为base
参数:

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

2.10 torch.eye()

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

功能: 创建单位对角矩阵(2维张量)
注意事项: 默认方阵
参数:

  • n: 矩阵行数
  • m: 矩阵列数

三、依概率分布创建张量

3.1 torch.normal()

torch.normal(mean,
			std,
			out=None)
			
torch.normal(mean,
			std,
			size,
			out=None)			

功能:生成正态分布
参数:

  • mean: 均值
  • std: 标准差
    四种模式:
  • mean是标量, std是标量 (没能运行成功,可能版本问题)
  • mean是标量, std是张量
  • mean是张量, std是标量
  • mean是张量, std是张量
flag = True
if flag:
    # mean: 张量; std: 张量
    mean = torch.arange(1, 5, dtype=torch.float)
    std = torch.arange(1, 5, dtype=torch.float)
    t_normal1 = torch.normal(mean, std)
    print('mean:{}\nstd:{}'.format(mean, std))
    print(t_normal1)
    
    # mean: 张量, std: 标量
    t_normal2 = torch.normal(mean, 1)
    print(t_normal2)
    
    # mean: 标量, std: 张量
    t_normal2 = torch.normal(0., std)
    print(t_normal2)
>>>
mean:tensor([1., 2., 3., 4.])
std:tensor([1., 2., 3., 4.])
tensor([1.5164, 0.7705, 9.4894, 0.7906])
tensor([0.6021, 1.2874, 2.5276, 3.1236])
tensor([-1.2483, -1.6057,  3.2328, -0.6405])

3.2 torch.randn()

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

功能: 生成标准正态分布
参数:

  • size: 张量的形状

3.3 torch.randn_like()

3.4 torch.rand()

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

功能: 再区间[0, 1)上,生成均匀分布

3.5 torch.rand_like()

3.6 torch.randint()

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

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

  • size: 张量的形状

3.8 torch.randperm()

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

功能: 生成从0到n-1的随机排列
参数:

  • n: 张量的长度

3.9 torch.bernoulli()

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

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

  • input: 概率值
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值