张量的英文是Tensor,它是PyTorch里面基础的运算单位,与Numpy中的ndarray相同都表示的是一个多维的矩阵。 与ndarray的最大区别就是,PyTorch的Tensor可以在 GPU 上运行,而 numpy 的 ndarray 只能在 CPU 上运行,在GPU上运行大大加快了运算速度
首先导入所需库函数
import torch
import numpy as np
torch.__version__
下面我们生成一个简单的张量
x = torch.rand(2, 3)
print(x)
tensor([[0.6904, 0.7419, 0.8010],
[0.1722, 0.2442, 0.8181]])
以上生成了一个,2行3列的的矩阵,我们看一下他的大小:
# 可以使用与numpy相同的shape属性查看
print(x.shape)
# 也可以使用size()函数,返回的结果都是相同的
print(x.size())
torch.Size([2, 3])
torch.Size([2, 3])
下面我们来生成一些多维的张量:
pythony=torch.rand(2,3,4,5)
print(y.size())
torch.Size([2, 3, 4, 5])
在同构的意义下:
其中要特别注意的就是标量,我们先生成一个标量:
#我们直接使用现有数字生成
scalar =torch.tensor(3.1433223)
print(scalar)
#打印标量的大小
scalar.size()
tensor(3.1433)
torch.Size([])
对于标量,我们可以直接使用 .item() 从中取出其对应的python对象的数值
scalar.item()
3.143322229385376
特别的:如果张量中只有一个元素的tensor也可以调用tensor.item方法
tensor = torch.tensor([3.1433223])
print(tensor)
tensor.size()
tensor([3.1433])
torch.Size([1])
tensor.item()
3.143322229385376
Tensor的基本数据类型有五种:
long=tensor.long()
long
tensor([3])
half=tensor.half()
half
tensor([3.1426], dtype=torch.float16)
int_t=tensor.int()
int_t
tensor([3], dtype=torch.int32)
flo = tensor.float()
flo
tensor([3.1433])
short = tensor.short()
short
tensor([3], dtype=torch.int16)
ch = tensor.char()
ch
tensor([3], dtype=torch.int8)
bt = tensor.byte()
bt
tensor([3], dtype=torch.uint8)
使用numpy方法将Tensor转为ndarray
a = torch.randn((3, 2))
# tensor转化为numpy
numpy_a = a.numpy()
print(numpy_a)
[[ 0.46819344 1.3774964 ]
[ 0.9491934 1.4543315 ]
[-0.42792308 0.99790514]]
numpy转化为Tensor
torch_a = torch.from_numpy(numpy_a)
torch_a
tensor([[ 0.4682, 1.3775],
[ 0.9492, 1.4543],
[-0.4279, 0.9979]])
Tensor和numpy对象共享内存,所以他们之间的转换很快,而且几乎不会消耗什么资源。但这也意味着,如果其中一个变了,另外一个也会随之改变。
一般情况下可以使用.cuda方法将tensor移动到gpu,这步操作需要cuda设备支持
cpu_a=torch.rand(4, 3)
cpu_a.type()
'torch.FloatTensor'
gpu_a=cpu_a.cuda()
gpu_a.type()
'torch.cuda.FloatTensor'
使用.cpu方法将tensor移动到cpu
cpu_b=gpu_a.cpu()
cpu_b.type()
'torch.FloatTensor'
如果我们有多GPU的情况,可以使用to方法来确定使用那个设备,这里只做个简单的实例:
#使用torch.cuda.is_available()来确定是否有cuda设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(device)
#将tensor传送到设备
gpu_b=cpu_b.to(device)
gpu_b.type()
cuda
'torch.cuda.FloatTensor'
Pytorch中有许多默认的初始化方法可以使用
# 使用[0,1]均匀分布随机初始化二维数组
rnd = torch.rand(5, 3)
rnd
tensor([[0.3804, 0.0297, 0.5241],
[0.4111, 0.8887, 0.4642],
[0.7302, 0.5913, 0.7182],
[0.3048, 0.8055, 0.2176],
[0.6195, 0.1620, 0.7726]])
##初始化,使用1填充
one = torch.ones(2, 2)
one
tensor([[1., 1.],
[1., 1.]])
##初始化,使用0填充
zero=torch.zeros(2,2)
zero
tensor([[0., 0.],
[0., 0.]])
#初始化一个单位矩阵,即对角线为1 其他为0
eye=torch.eye(2,2)
eye
tensor([[1., 0.],
[0., 1.]])
PyTorch中对张量的操作api 和 NumPy 非常相似,如果熟悉 NumPy 中的操作,那么他们二者基本是一致的:
x = torch.randn(3, 3)
print(x)
tensor([[ 0.6922, -0.4824, 0.8594],
[ 0.4509, -0.8155, -0.0368],
[ 1.3533, 0.5545, -0.0509]])
max_value, max_idx = torch.max(x, dim=1)
print(max_value, max_idx)
tensor([0.8594, 0.4509, 1.3533]) tensor([2, 0, 0])
# 每行 x 求和
sum_x = torch.sum(x, dim=1)
print(sum_x)
tensor([ 1.0692, -0.4014, 1.8568])
y=torch.randn(3, 3)
z = x + y
print(z)
tensor([[-0.3821, -2.6932, -1.3884],
[ 0.7468, -0.7697, -0.0883],
[ 0.7688, -1.3485, 0.7517]]
正如官方60分钟教程中所说,以_为结尾的,均会改变调用值
# add 完成后x的值改变了
x.add_(y)
print(x)
tensor([[-0.3821, -2.6932, -1.3884],
[ 0.7468, -0.7697, -0.0883],
[ 0.7688, -1.3485, 0.7517]])