【PyTorch】1.1认识Pytorch

什么是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))在这里插入代码片

猜你喜欢

转载自blog.csdn.net/kz_java/article/details/121381583