Pytorch学习-张量

什么是Pytorch?

这是一个基于Python的科学计算软件包,针对以下两组受众:

  • NumPy的替代品,可以使用GPU的强大功能
  • 深入学习研究平台,提供最大的灵活性和速度

即Pytorch是一个基于Python的科学计算包,可以作为NumPy的替代品,加上可以是用GPU加速的,主要应用是提供一个深度学习的研究平台,这个平台特点是灵活性与速度兼备。

张量

张量类似于NumPy的ndarray,另外还有Tensors也可用于GPU加速计算

张量就理解为一个n维的数组,特殊的是在Pytorch里面是支持GPU加速的计算的。

导入包

1
2
from __future__ import print_function
import torch

然后构造一个5x3的矩阵,不进行初始化

1
2
3
4
x = torch.empty(5,3)
print(x)
#输出发现默认是初始化的
print(torch.__version__)
1
2
3
4
5
6
tensor([[0.0000, 0.0000, 0.0000],
[0.0000, 0.0000, 0.0000],
[0.0000, 0.0000, 0.0000],
[0.0000, 0.0000, 0.0000],
[0.0000, 0.0000, 0.0000]])
0.4.1

然后,随机初始化一个5x3矩阵

1
2
x = torch.rand(5,3)
print(x)
1
2
3
4
5
tensor([[0.5781, 0.8242, 0.6342],
[0.4345, 0.5533, 0.6515],
[0.0493, 0.2967, 0.4310],
[0.8753, 0.8401, 0.1978],
[0.7999, 0.0672, 0.7941]])

构造一个0填充的矩阵,并且指定元素类型为long

1
2
x =  torch.zeros(5, 3, dtype = torch.long)
print(x)
1
2
3
4
5
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])

从原始数据创建张量,例如从一个数组创建

1
2
x = torch.tensor([5.5, 3])
print(x)
1
tensor([5.5000, 3.0000])

或者根据现有的张量创建张量。这些方法将重用输入张量的属性,例如, dtype,除非用户提供新值

1
2
3
4
x = x.new_ones(5, 3, dtype = torch.double)#创建一个大小为5x3,初始化为1且元素类似设为double
print(x)
x = torch.randn_like(x, dtype = torch.float)#通过原有的张量创建张量,并修改元素的类型,返回张量大小不变
print(x)
1
2
3
4
5
6
7
8
9
10
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[ 0.0766, 0.5968, -0.2822],
[ 0.1909, -0.9917, -0.4727],
[-0.8356, 2.4588, 0.8526],
[-1.4003, 1.0183, 0.4106],
[-1.0247, 0.0156, 0.8494]])
1
2
#获取张量的大小
print(x.size())
1
torch.Size([5, 3])
1
#torch.Size类型实际上是一个元组的类型,它支持所有元组的操作

张量的操作

张量有多个语法的操作,先查看张量之间的加法操作

1
2
3
4
#示例1
#直接加法运算符
y = torch.rand(5, 3)
print(x + y)
1
2
3
4
5
tensor([[ 0.9503,  0.8084,  0.5530],
[ 0.2537, -0.5139, -0.0843],
[-0.4697, 3.2197, 1.6875],
[-0.8058, 1.7099, 1.2317],
[-0.8071, 0.9088, 1.5395]])
1
2
3
#示例2
#调用add函数
print(torch.add(x, y))
1
2
3
4
5
tensor([[ 0.9503,  0.8084,  0.5530],
[ 0.2537, -0.5139, -0.0843],
[-0.4697, 3.2197, 1.6875],
[-0.8058, 1.7099, 1.2317],
[-0.8071, 0.9088, 1.5395]])
1
2
3
4
5
#示例3
#add函数还提供了一个输出的张量作为参数
result = torch.empty(5, 3)
torch.add(x, y, out = result)
print(result)
1
2
3
4
5
tensor([[ 0.9503,  0.8084,  0.5530],
[ 0.2537, -0.5139, -0.0843],
[-0.4697, 3.2197, 1.6875],
[-0.8058, 1.7099, 1.2317],
[-0.8071, 0.9088, 1.5395]])
1
2
3
4
5
#示例4
#将x+y结果赋予到y
#add_函数
y.add_(x)
print(y)
1
2
3
4
5
tensor([[ 0.9503,  0.8084,  0.5530],
[ 0.2537, -0.5139, -0.0843],
[-0.4697, 3.2197, 1.6875],
[-0.8058, 1.7099, 1.2317],
[-0.8071, 0.9088, 1.5395]])
1
#类似的将结果赋予到对象的操作,函数都将是以_为后缀命名,类似的操作函数还有x.copy_(y), x.t_(),执行后x的值将会改变
1
2
3
4
#支持类似NumPy风格的切片操作
print(x)
#输出第二列
print(x[: , 1])
1
2
3
4
5
6
tensor([[ 0.0766,  0.5968, -0.2822],
[ 0.1909, -0.9917, -0.4727],
[-0.8356, 2.4588, 0.8526],
[-1.4003, 1.0183, 0.4106],
[-1.0247, 0.0156, 0.8494]])
tensor([ 0.5968, -0.9917, 2.4588, 1.0183, 0.0156])
1
2
3
4
5
6
7
8
9
#假如想改变张量的大小,可以使用torch.view()函数
#创建一个4x4张量
x = torch.randn(4, 4)
#改变大小
y = x.view(16)
#改变大小
z = x.view(-1, 8)#-1表示让函数自动推算出来,推算为2x8
print(x.size(), y.size(), z.size())
#改变大小形状,元素数量不变
1
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
1
2
3
4
#假如是只有一个元素的张量,可以使用item函数返回其数值,返回值类型为一个数字
x = torch.randn(1)
print(x)
print(x.item())
1
2
tensor([0.2401])
0.24008719623088837

pytorch支持的操作超过100多种,了包括转置,索引,切片,数学运算,线性代数,随机数等

Torch tensor与NumPy数组的联系与转换

两者之间的转换时非常方便的,在pytorch里面是一件轻而易举的事情,但是需要注意的是,两者的值在底层的内存是共享的,这意味着改变一个的值,另一个也随之改变。

1
2
3
#创建一个tensor
a = torch.ones(5)
print(a)
1
tensor([1., 1., 1., 1., 1.])
1
2
3
#转换为NumPy的数组
b = a.numpy()
print(b)
1
[1. 1. 1. 1. 1.]
1
2
3
4
#验证两者是否内存共享
a.add_(1)
print(a)
print(b)
1
2
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]

反过来的转换

1
2
3
4
5
6
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out = a)
print(a)
print(b)
1
2
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

使用cuda进行计算

1
2
3
4
5
6
7
8
#检查cuda是否keyong 
if torch.cuda.is_available():
device = torch.device("cuda")#设置设备的对象
y = torch.randn_like(x, device = device)#创建tensor时指定在gpu的设备上创建
x = x.to(device)#将变量转移到gpu设备上
z = x + y#在gpu上计算
print(z)
print(z.to("cpu", torch.double))#将结果转至cpu
1
2
tensor([1.0779], device='cuda:0')
tensor([1.0779], dtype=torch.float64)

相关阅读

win10安装Pytorch

-------------本文结束感谢您的阅读-------------