Pytorch学习笔记——Tensor操作的基本语法

一、什么是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))

你可能感兴趣的:(学习笔记,机器学习,深度学习)