一、什么是Pytorch
Pytorch是一个基于Numpy的科学计算包, 向它的使用者提供了两大功能:
1.作为Numpy的替代者, 向用户提供使用GPU强大功能的能力。
2.做为一款深度学习的平台, 向用户提供最大的灵活性和速度。
二、Pytorch的基本元素操作
Tensors张量: 张量的概念类似于Numpy中的ndarray数据结构, 最大的区别在于Tensor可以利用GPU的加速功能。
#使用Pytorch的时候, 常规步骤是先将torch引用进来
from __future__ import print_function
import torch
#创建矩阵操作
#创建一个5行3列没有初始化的矩阵
x1 = torch.empty(5, 3)
print(x1)
#创建一个5行3列随机初始化的矩阵
x2 = torch.rand(5, 3)
print(x2)
#创建一个全零矩阵并可指定数据元素的类型为long
x3 = torch.zeros(5, 3, dtype=torch.long)
print(x3)
#直接通过数据创建张量
x4 = torch.tensor([2.5, 3.5])
print(x4)
#通过已有的一个张量创建相同尺寸的新张量
x5 = x4.new_ones(5, 3, dtype=torch.double)# 利用news_methods方法得到一个张量
print(x5)
# 利用randn_like方法得到相同张量尺寸的一个新张量, 并且采用随机初始化来对其赋值
y = torch.randn_like(x, dtype=torch.float)
print(y)
#得到张量的尺寸:
print(x5.size())
输出结果:
tensor([[1.5152e-34, 5.8154e-43, 1.5152e-34],
[5.8154e-43, 1.5152e-34, 5.8154e-43],
[1.5152e-34, 5.8154e-43, 1.5152e-34],
[5.8154e-43, 1.5152e-34, 5.8154e-43],
[1.5149e-34, 5.8154e-43, 1.5149e-34]])
tensor([[0.5143, 0.3048, 0.9819],
[0.0780, 0.1773, 0.9729],
[0.1176, 0.1666, 0.8590],
[0.2809, 0.4928, 0.9554],
[0.3487, 0.3435, 0.6148]])
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
tensor([2.5000, 3.5000])
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[-0.4327, 0.2430, 0.0941],
[-0.9378, -1.2950, 3.2270],
[-1.2122, -1.2375, -0.7561],
[-0.4700, 0.7031, 0.0954],
[ 0.7059, -0.5689, -0.6041]])
torch.Size([5, 3])
Process finished with exit code 0
【注】:
1.对比有无初始化的矩阵: 当声明一个未初始化的矩阵时, 它本身不包含任何确切的值. 当创建一个未初始化的矩阵时, 分配给矩阵的内存中有什么数值就赋值给了这个矩阵, 本质上是毫无意义的数据。
2.torch.Size函数本质上返回的是一个tuple, 因此它支持一切元组的操作。
三、Pytorch的基本运算操作
from __future__ import print_function
import torch
x = torch.rand(5, 3)
y = torch.rand(5, 3)
print(x)
print(y)
#加法操作
#第一种加法方式
print(x + y)
#第二种加法方式
print(torch.add(x, y))
#第三种加法方式
result = torch.empty(5, 3) # 提前设定一个空的张量
torch.add(x, y, out=result)# 将空的张量作为加法的结果存储张量
print(result)
#第四种加法方式: in-place (原地置换)
y.add_(x)
print(y)
#可用类似于Numpy的方式对张量进行切片操作:
print(y[:, 1])
#torch.view()方法改变张量的形状:
x = y
y = x.view(15) # tensor.view()操作需要保证数据元素的总数量不变
z = x.view(-1, 5) # -1代表自动匹配个数
print(x.size(), y.size(), z.size())
#如果张量中只有一个元素, 可以用.item()将值取出, 作为一个python number
n = torch.randn(1)
print(n)
print(n.item())
输出结果:
tensor([[0.2036, 0.2415, 0.8345],
[0.6173, 0.4904, 0.8976],
[0.7329, 0.6045, 0.6183],
[0.0301, 0.9781, 0.9615],
[0.4962, 0.5545, 0.1488]])
tensor([[0.9505, 0.6380, 0.5618],
[0.1223, 0.6432, 0.1424],
[0.7335, 0.7995, 0.3028],
[0.6813, 0.6223, 0.9663],
[0.2785, 0.9525, 0.8299]])
tensor([[1.1541, 0.8794, 1.3962],
[0.7396, 1.1336, 1.0400],
[1.4664, 1.4040, 0.9211],
[0.7114, 1.6005, 1.9278],
[0.7747, 1.5070, 0.9787]])
tensor([[1.1541, 0.8794, 1.3962],
[0.7396, 1.1336, 1.0400],
[1.4664, 1.4040, 0.9211],
[0.7114, 1.6005, 1.9278],
[0.7747, 1.5070, 0.9787]])
tensor([[1.1541, 0.8794, 1.3962],
[0.7396, 1.1336, 1.0400],
[1.4664, 1.4040, 0.9211],
[0.7114, 1.6005, 1.9278],
[0.7747, 1.5070, 0.9787]])
tensor([[1.1541, 0.8794, 1.3962],
[0.7396, 1.1336, 1.0400],
[1.4664, 1.4040, 0.9211],
[0.7114, 1.6005, 1.9278],
[0.7747, 1.5070, 0.9787]])
tensor([0.8794, 1.1336, 1.4040, 1.6005, 1.5070])
torch.Size([5, 3]) torch.Size([15]) torch.Size([3, 5])
tensor([1.4215])
1.421471357345581
Process finished with exit code 0
四、Torch Tensor和Numpy array之间的相互转换
from __future__ import print_function
import numpy as np
import torch
a = torch.ones(5)
print(a)
b = a.numpy() #将Torch Tensor转换为Numpy array
print(b)
a.add_(1) #对其中一个进行加法操作, 另一个也随之被改变
print(a)
print(b)
m = np.ones(5)
n = torch.from_numpy(m)
np.add(m, 1, out=m)
print(a)
print(b)
输出结果:
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
Process finished with exit code 0
【注】:
1.所有在CPU上的Tensors, 除了CharTensor, 都可以转换为Numpy array并可以反向转换.
2.Torch Tensor和Numpy array共享底层的内存空间, 因此改变其中一个的值, 另一个也会随之被改变.
五、Cuda Tensor
Tensors可以用.to()方法来将其移动到任意设备上
from __future__ import print_function
import torch
x = torch.rand(5, 3)
# 如果服务器上已经安装了GPU和CUDA
if torch.cuda.is_available():
# 定义一个设备对象, 这里指定成CUDA, 即使用GPU
device = torch.device("cuda")
# 直接在GPU上创建一个Tensor
y = torch.ones_like(x, device=device)
# 将在CPU上面的x张量移动到GPU上面
x = x.to(device)
# x和y都在GPU上面, 才能支持加法运算
z = x + y
# 此处的张量z在GPU上面
print(z)
# 也可以将z转移到CPU上面, 并同时指定张量元素的数据类型
print(z.to("cpu", torch.double))