首先简单说明一下什么是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类型数据的几种方法
-
使用
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.LongTensor
和torch.FloatTensor
等,与dtype
匹配。 -
从
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.]]) ```
-
由
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 ⌈stepend−start⌉的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 ⌊stepend−start⌋+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)