Tensors张量: 张量的概念类似于Numpy中的ndarray数据结构, 最大的区别在于Tensor可以利用GPU的加速功能.
张量是一个统称,其中包含很多类型: 【各种数值数据统称为张量】
0阶张量:标量、常数,0-D Tensor 【scaler】
1阶张量:向量,1-D Tensor 【vector】
2阶张量:矩阵,2-D Tensor 【matrix】
3阶张量
...
N阶张量
1.使用python中的列表或者序列创建tensor,直接通过数据创建张量
import torch
ret = torch.tensor([[1, -1], [1, -1]])
print(ret)
2.使用numpy中的数组创建tensor,直接通过数据创建张量
import torch
import numpy as np
ret = torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]))
print(ret)
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
3.使用torch的api创建tensor,创建一个没有初始化的矩阵
torch.empty(3,4)
创建3行4列的空的tensor,会用无用数据进行填充 【torch.empty([3, 4]),加上中括号也是可以的】import torch
ret = torch.empty([3, 4])
print(ret)
注意:torch.empty()填充的数据不是0,是随机的数字,本人试过好多数据,仅发现了torch.empty(3,4)输出的矩阵结果全是0。
当声明一个未初始化的矩阵时, 它本身不包含任何确切的值. 当创建一个未初始化的矩阵时, 分配给矩阵的内存中有什么数值就赋值给了这个矩阵, 本质上是毫无意义的数据.
torch.ones([3,4])
创建3行4列的全为1的tensorimport torch
ret = torch.ones([3, 4])
print(ret)
torch.zeros([3,4])
创建3行4列的全为0的tensorimport torch
ret = torch.zeros([3, 4])
print(ret)
torch.rand([3,4])
创建3行4列的随机值的tensor,随机值的区间是[0, 1)
import torch
ret = torch.rand([3, 4])
print(ret)
torch.randint(low=0,high=10,size=[3,4])
创建3行4列的随机整数的tensor,随机值的区间是[low, high)
import torch
ret = torch.randint(0, 5, [3, 4])
print(ret)
torch.randn([3,4])
创建3行4列的随机数的tensor,随机值的分布式均值为0,方差为1import torch
ret = torch.randn([3, 4])
print(ret)
获取tensor中的数据(当tensor中只有一个元素可用):tensor.item()
import torch
import numpy as np
ret = torch.tensor(np.arange(1))
print(ret)
print(ret.item())
import torch
import numpy as np
ret = torch.tensor([[[[1.3]]]])
print(ret)
print(ret.item())
转化为numpy数组
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret.numpy())
获取形状:tensor.size()
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret.size())
形状改变:tensor.view((3,4))
。类似numpy中的reshape,是一种浅拷贝,仅仅是形状发生改变
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
# print(ret.view((2, 6)))
print(ret.view(2, 6)) # 和上面的写法是一样的
print(ret)
获取阶数:tensor.dim() 【如果为常数,则返回0】
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret.dim())
获取最大值:tensor.max() 【x.std()】
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret.max())
转置:tensor.t()
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret.t())
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret.transpose(0, 1)) # 这里面是数字不能随意写的
tensor[1,3]
获取tensor中第一行第三列的值
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret[1, 2])
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret[:2])
print(ret[1:2])
print(ret[:2, :2])
tensor[1,3]=100
对tensor中第一行第三列的位置进行赋值100
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
ret[0, 2] = 100
print(ret[:2])
tensor的切片
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret[:, 2])
tensor中的数据类型非常多,常见类型如下:
上图中的Tensor types表示这种type的tensor是其实例
获取tensor的数据类型:tensor.dtype
import torch
import numpy as np
ret = torch.tensor(np.arange(12).reshape(3, 4))
print(ret)
print(ret.dtype)
创建数据的时候指定类型
import torch
ret = torch.ones([2, 3], dtype=torch.float32)
print(ret)
print(ret.dtype)
类型的修改
import torch
ret = torch.ones([2, 3], dtype=torch.float32)
print(ret)
print(ret.type(torch.int32))
print(ret.dtype)
print(ret.double())
print(ret.dtype)
Torch Tensor和Numpy array之间的相互转换
tensor和tensor相加
import torch
x = torch.ones([2, 3], dtype=torch.float32)
y = torch.randn(2, 3)
print(x)
print(y)
print(x + y)
import torch
x = torch.ones([2, 3], dtype=torch.float32)
y = torch.randn(2, 3)
print(x)
print(y)
print(torch.add(x, y))
import torch
x = torch.ones([2, 3], dtype=torch.float32)
y = torch.randn(2, 3)
print(x)
print(y)
print(x.add(y))
print(x)
print(y)
import torch
x = torch.ones([2, 3], dtype=torch.float32)
y = torch.randn(2, 3)
print(x)
print(y)
print(x.add_(y)) # 带下划线的方法会对x进行就地修改
print(x)
print(y)
注意:带下划线的方法(比如:add_
)会对tensor进行就地修改
tensor和数字操作
import torch
x = torch.ones([2, 3], dtype=torch.float32)
y = 10
print(x)
print(x + y)
tensor的另外一种加法操作
CUDA中的tensor
CUDA(Compute Unified Device Architecture),是NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。
torch.cuda
这个模块增加了对CUDA tensor的支持,能够在cpu和gpu上使用相同的方法操作tensor
通过.to
方法能够把一个tensor转移到另外一个设备(比如从CPU转到GPU)
import torch
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 判断当前电脑是否支持GPU计算
print(device)
# # 如果服务器上已经安装了GPU和CUDA
if torch.cuda.is_available():
device = torch.device("cuda") # cuda device对象
y = torch.ones([3, 4], device=device) # 创建一个在cuda上的tensor
x = y.to(device) # 使用方法把x转为cuda 的tensor
# # x和y都在GPU上面, 才能支持加法运算
z = x + y
print(z) # 此处的张量z在GPU上面
print(z.to("cpu", torch.double)) # .to方法也能够同时设置类型
else:
print("I am cpu")
# print(torch.tensor([1.9806], device='cuda:0'))
# print(torch.tensor([1.9806], dtype=torch.float64))
通过前面的学习,可以发现torch的各种操作几乎和numpy一样