如何创建一个Tensor

首先简单说明一下什么是Tensor,它指的是高维张量,存在于n维空间;其维度不同于向量或矩阵的维度,他们只存在于平面上;与numpy里的Array比较类似。可以将其维度看作“[”括号的个数。其中每个数字代表的就是中括号里元素的个数,2就是最外成的中括号里有2个元素,这里将每个中括号看作一个元素。2和3同理。这样的话,任意给定一个高维的张量,也能判断它的形状了。

再就是axis的理解。从输出结果看,axis从小到大指定的就是shape输出里从左至右的维度。比如3,就是值最里层的那个中括号里有三个元素。

tensor.ones([2,2,3])

>>> tensor([[[1., 1., 1.],
			[1., 1., 1.]],

		   [[1., 1., 1.],
			[1., 1., 1.]]])

得到Tensor类型数据的几种方法

  1. 使用torch.tensor()方法torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)Tensor
    data:可以是list, tuple,NumPy ndarray, scalar 或者其他类型数据。该方法创建的Tensor,其数据类型与data的数据类型保持对应关系,它可以设置requires_grad=True
    使用torch.Tensor(),他是Python中的一个类,是默认张量torch.FloatTensor()的别名。它不可以直接设置requires_grad=True,需要在创建对象以后,手动设置Tensor.requires_grad_(True)

    >>> import torch 
    >>> import numpy as np
    >>> a = np.zeros([2], dtype = np.int64)
    >>> b = torch.tensor(a)
    >>> c = torch.Tensor(1)
    >>> print('type(a):',type(a), '\na.dtype:', a.dtype, '\ntype(b):', type(b), '\nb.type():', b.type(), '\nb.dtype', b.dtype, '\ntype(c):', type(c), '\nc.type():', c.type(), '\nc.dtype:', c.dtype)
    
    type(a): <class 'numpy.ndarray'> 
    a.dtype: int64 
    type(b): <class 'torch.Tensor'> 
    b.type(): torch.LongTensor 
    b.dtype torch.int64 
    type(c): <class 'torch.Tensor'> 
    c.type(): torch.FloatTensor 
    c.dtype: torch.float32
    

    其中type()是python的内置函数,显示变量的类别,.dtype是Python中对象的属性,显示数据类型(即,data type),.type()是torch中所定义的Tensor的数据类型,常见的包括torch.LongTensortorch.FloatTensor等,与dtype匹配。

  2. numpy.ndarray数据转化成,使用torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)Tensor方法

    >>> a = np.ones([2,3])
    >>> a_tensor = torch.from_numpy(a)
    tensor([[1., 1., 1.],
    		[1., 1., 1.]], dtype=torch.float64)
    

    Tensor转化为numpy的方法为Tensor.numpy()

    >>> a_numpy = a_tensor.numpy()
    array([[1., 1., 1.],
       [1., 1., 1.]])
       ```
    
    
  3. torch包里的内置函数生成,包括以下常用函数

方法名 功能
torch.zeros(*size) 生成全0的tensor
torch.ones(*size) 生成全1的tensor
torch,eye(*size) 对角线为1,其他为0的Tensor,只能生成2维Tensor
torch.arange(start=0, end, step=1) 返回一个大小为 ⌈ e n d − s t a r t s t e p ⌉ \lceil \frac{end-start}{step}\rceil stependstart的1-D张量
torch.range(start=0, end, step=1) 返回一个大小为 ⌊ e n d − s t a r t s t e p ⌋ + 1 \lfloor \frac{end-start}{step}\rfloor + 1 stependstart+1的1-D张量
torch.linspace(start, end, steps=100) 从 start 到 end,均匀切分为steps份
torch.logspace(start, end, steps=100, base=10.0) 从 start 到 end,均匀切分为steps份 b a s e i base^{i} basei构成的1-D张量
torch.empty(*size) 初始化一个未指定data值的张量,大小为size,data值其实是很小的数
torch.full(size, fill_value) fill_value的值填满大小为size的Tensor
torch.rand/randn(*sizes) 均匀/标准分布
torch.normal(mean,std)/uniform(from,to) 正太分布/标准分布
randperm(m) 随机排列

Note:CUDA Tensors.to()方法可以将Tensor在CPU和GPU之间相互转化。

if torch.cuda.is_available():
    device = torch.device("cuda")          # a CUDA device object
    y = torch.ones_like(x, device=device)  # directly create a tensor on GPU
    x = x.to(device)                       # or just use strings ``.to("cuda")``
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # ``.to`` can also change dtype together!

out:
tensor([1.8299], device='cuda:0')
tensor([1.8299], dtype=torch.float64)

猜你喜欢

转载自blog.csdn.net/Huang_Fj/article/details/118103848
今日推荐