Pytorch学习-张量

本文共有5169个字,关键词:

什么是Pytorch?

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

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

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

张量

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

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

导入包

from __future__ import print_function
import torch

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

x = torch.empty(5,3)
print(x)
#输出发现默认是初始化的
print(torch.__version__)
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矩阵

x = torch.rand(5,3)
print(x)
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

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([5.5, 3])
print(x)
tensor([5.5000, 3.0000])

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

x = x.new_ones(5, 3, dtype = torch.double)#创建一个大小为5x3,初始化为1且元素类似设为double
print(x)
x = torch.randn_like(x, dtype = torch.float)#通过原有的张量创建张量,并修改元素的类型,返回张量大小不变
print(x)
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]])
#获取张量的大小
print(x.size())
torch.Size([5, 3])
#torch.Size类型实际上是一个元组的类型,它支持所有元组的操作

张量的操作

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

#示例1
#直接加法运算符
y = torch.rand(5, 3)
print(x + y)
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]])
#示例2
#调用add函数
print(torch.add(x, y))
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]])
#示例3
#add函数还提供了一个输出的张量作为参数
result = torch.empty(5, 3)
torch.add(x, y, out = result)
print(result)
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]])
#示例4
#将x+y结果赋予到y
#add_函数
y.add_(x)
print(y)
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]])
#类似的将结果赋予到对象的操作,函数都将是以_为后缀命名,类似的操作函数还有x.copy_(y), x.t_(),执行后x的值将会改变
#支持类似NumPy风格的切片操作
print(x)
#输出第二列
print(x[: , 1])
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])
#假如想改变张量的大小,可以使用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())
#改变大小形状,元素数量不变
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
#假如是只有一个元素的张量,可以使用item函数返回其数值,返回值类型为一个数字
x = torch.randn(1)
print(x)
print(x.item())
tensor([0.2401])
0.24008719623088837

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

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

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

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

反过来的转换

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

使用cuda进行计算

#检查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
tensor([1.0779], device='cuda:0')
tensor([1.0779], dtype=torch.float64)
版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。
 没有了 Pytorch学习-自动求导 
添加新评论
暂无评论