什么是PyTorch
PyTorch是一个基于Numpy的科学计算包,向它的使用者提供了两大功能。
- 作为Numpy的代替这,向用户提供使用GPU强大功能的能力
- 作为一款深度学习的平台,向用户提供最大的灵活性和是速度
PyTorch的基本元素操作
Tensor张量
张量的概念类似于Numpy中的ndarray数据结构,最大的区别在于Tensor可以利用GPU的加速功能
创建矩阵
创建没有初始化的矩阵
from __future__ import print_function
import torch
# 创建一个没有初始化的矩阵
x=torch.empty(5,3)
print(x)
创建有初始化的矩阵
# 创建一个有初始化的矩阵
x = torch.rand(5, 3)
print(x)
有无初始化的矩阵之间的对比:
当声明一个未初始化的矩阵时,它本身不包含任何确切的值,当创建一个未初始化的矩阵时,分配给矩阵的内存中有什么数值就赋值给了这个矩阵 ,本质上是毫无意义的数据。
创建一个全零的矩阵并可指定数据元素的类型为long
x=torch.zeros(5,3,dtype=torch.long)
print(x)
#输出
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
直接通过数据创建张量
x=torch.tensor([2.1,3.2])
print(x)
#输出
tensor([2.1000, 3.2000])
通过已有的一个张量创建相同尺寸的新张量
#利用new_methods方法得到一个张量
x=torch.zeros(5,3,dtype=torch.long)
print(x)
new_x=x.new_ones(5,3,dtype=torch.double)
print(new_x)
#利用rand_like方法得到相同张量尺寸的一个新张量,并且采用随机初始化来对其赋值
y=torch.randn_like(x,dtype=torch.float)
print(y)
tensor.size()方法获取张量的形状
print(x.size())
print(new_x.size())
print(y.size())
print(type(x.size()))
a,b=x.size()
print(a,b)
# 输出
torch.Size([5, 3])
torch.Size([5, 3])
torch.Size([5, 3])
<class 'torch.Size'>
5 3
pytorch的基本运算操作
加法
x=torch.ones(5,3)
print(x)
y=torch.ones(5,3)
print(y)
print(x+y)
print(x)
x+=y
print(x)
print(x.add(y))
利用类似于Numpy的方式对张量进行类似于切片的操作
x=torch.rand(5,3)
print(x)
print(x[:,1]) #取index为1的列,即第2列(因为下标从0开始)
print(x[:]) #取所有列
print(x[:,]) #取所有列
print(x[:,:2])#取前两列
print(x[:,1:2])#取第2列
#输出
tensor([[0.8360, 0.5498, 0.7975],
[0.8335, 0.0913, 0.3724],
[0.2350, 0.1795, 0.0566],
[0.0164, 0.0435, 0.5197],
[0.1286, 0.1520, 0.1825]])
tensor([0.5498, 0.0913, 0.1795, 0.0435, 0.1520])
tensor([[0.8360, 0.5498, 0.7975],
[0.8335, 0.0913, 0.3724],
[0.2350, 0.1795, 0.0566],
[0.0164, 0.0435, 0.5197],
[0.1286, 0.1520, 0.1825]])
tensor([[0.8360, 0.5498, 0.7975],
[0.8335, 0.0913, 0.3724],
[0.2350, 0.1795, 0.0566],
[0.0164, 0.0435, 0.5197],
[0.1286, 0.1520, 0.1825]])
tensor([[0.8360, 0.5498],
[0.8335, 0.0913],
[0.2350, 0.1795],
[0.0164, 0.0435],
[0.1286, 0.1520]])
tensor([[0.5498],
[0.0913],
[0.1795],
[0.0435],
[0.1520]])
改变张量的形状torch.view()
x=torch.rand(4,4)
print(x)
# x=tensor.view()操作需要保证数据元素的总数量不变
y=x.view(16)
print(y)
#-1代表自动匹配的个数
z=x.view(-1,8)# 2*8=16
print(z)
print(x.size(),y.size(),z.size())
#输出
tensor([[0.1940, 0.1072, 0.7347, 0.5758],
[0.9099, 0.8542, 0.9145, 0.3620],
[0.8057, 0.0462, 0.6999, 0.7488],
[0.4633, 0.7601, 0.3510, 0.2278]])
tensor([0.1940, 0.1072, 0.7347, 0.5758, 0.9099, 0.8542, 0.9145, 0.3620, 0.8057,
0.0462, 0.6999, 0.7488, 0.4633, 0.7601, 0.3510, 0.2278])
tensor([[0.1940, 0.1072, 0.7347, 0.5758, 0.9099, 0.8542, 0.9145, 0.3620],
[0.8057, 0.0462, 0.6999, 0.7488, 0.4633, 0.7601, 0.3510, 0.2278]])
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
tensor.item()
如果张量中只有一个元素,可以使用.item()将值取出,作为一个puthon number
x=torch.rand(1)
print(x)
print(x.item())
#输出
tensor([0.3500])
0.35003358125686646
类型转换
关于Torch Tensor和Numpy array之间的相互转换
Torch Tensor和Numpy array共享底层的内存空间,因此改变其中一个的值,另一个也会随之改变
x=torch.ones(5)
print(x)
y=x.numpy()
print(y)
#输出
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
x=torch.ones(5)
print(x)
x.add_(1)
print(x)
y=x.numpy()
print(y)
#输出
tensor([1., 1., 1., 1., 1.])
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
将Numpy array转换成Torch Tensor
a=np.ones(5)
b=torch.from_numpy(a)
np.add(a,1,out=a)
#对a的所有元素+1 然后原地赋值给a
print(a)
print(b)
#输出
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
注意:所有在CPU上的Tensors,除了CharTensor都可以转换成Numpy array并可以反向转换
【eg】先声明了一个numpy array 然后将其转换成tensor类型
再将tensor类型的数据反转成numpy array
a=np.ones(5)
b=torch.from_numpy(a)
print(a)
print(b)
y=b.numpy()
print(y)
关于Cuda Tensor
Tensors可以用它.to()方法来将其移动到任意设备上
from __future__ import print_function
import torch
import numpy as np
x=np.ones(5)
print(x)
#如果服务器上以及安装了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在GPU上
z=x+y
print(z)
#也可以将z转移到CPU上面,并同时指定张量元素的数据类型
print(z.to("cpu",torch.double))在这里插入代码片