PyTorch入门一-PyTorch与numpy
PyTorch的基础使用官方教程,主要描述了PyTorch与Numpy的关系
1. 前言
使用PyTorch时,没有那么多七七八八的导入,它时一个基于python的科学计算包,对于大众而言主要有两个方面的功能: 1. 通过使用GPU加速的高性能Numpy替代工具 2. 一个高度灵活和高速的深度学习研究平台
1 | import torch |
我们可以随机创建一个未初始化的矩阵(5*3)
1 | x=torch.empty(5,3) |
tensor([[1.8370e+25, 1.0901e+27, 1.7260e+25],
[1.2393e+28, 2.7376e+20, 7.3909e+22],
[2.2855e+20, 3.2607e-12, 7.0373e+22],
[6.7415e+22, 4.2038e+30, 1.4348e-19],
[2.7530e+12, 7.5338e+28, 1.4822e+11]])
我们也可以像使用numpy一样去创建向量或者张量等等。
1 | x = torch.rand(5, 3) |
tensor([[0.6813, 0.4026, 0.9534],
[0.8680, 0.3184, 0.6279],
[0.1557, 0.6849, 0.7569],
[0.8989, 0.8249, 0.7073],
[0.5857, 0.8452, 0.2623]])
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
tensor([5.5000, 3.0000])
同时我们也可以创建变量或者重写变量,这类方法通常会重用输入向量的属性,除非我们修改了其中的值
1 | x=x.new_ones(5,3,dtype=torch.double) #新建一个全1矩阵,尺寸为5*3 |
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[-0.5054, -1.0962, -1.0304],
[-2.1840, 1.5417, -0.2002],
[-0.5618, 0.3006, -0.3610],
[-2.1936, -1.7692, -0.4636],
[-0.1050, -1.2666, 1.8402]])
输出向量的尺寸也会非常的简单
1 | print(x.size()) |
torch.Size([5, 3])
因为是以元组(tuple)的形式保存的,故而它支持众多的其他运算
2. 运算
Torch支持许多的运算符,以加法为例:
1 | y = torch.rand(5,3) |
tensor([[-0.1500, -0.1588, -0.1751],
[-1.8099, 2.2868, 0.6413],
[-0.3108, 0.6843, 0.6317],
[-2.0301, -0.8799, -0.1055],
[ 0.3287, -0.8820, 2.5337]])
或是使用torch函数
1 | print(torch.add(x,y)) |
tensor([[-0.1500, -0.1588, -0.1751],
[-1.8099, 2.2868, 0.6413],
[-0.3108, 0.6843, 0.6317],
[-2.0301, -0.8799, -0.1055],
[ 0.3287, -0.8820, 2.5337]])
或者可以指定输出向量
1 | result = torch.empty(5,3) |
tensor([[-0.1500, -0.1588, -0.1751],
[-1.8099, 2.2868, 0.6413],
[-0.3108, 0.6843, 0.6317],
[-2.0301, -0.8799, -0.1055],
[ 0.3287, -0.8820, 2.5337]])
或者使用内联函数
1 | y.add_(x) |
tensor([[-0.1500, -0.1588, -0.1751],
[-1.8099, 2.2868, 0.6413],
[-0.3108, 0.6843, 0.6317],
[-2.0301, -0.8799, -0.1055],
[ 0.3287, -0.8820, 2.5337]])
注意:在torch中,所有使用_结尾的函数都会调整张量,例如:
x.copy_(y) , x.t_()
,都会改变x的值
在torch中所有的numpy的原生方法,如切片等也可以使用:
1 | print(x[:,1]) |
tensor([-1.0962, 1.5417, 0.3006, -1.7692, -1.2666])
如果需要调整张量的尺寸,你可以使用torch.view
1 | x = torch.randn(4,4) |
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
如果你有一个张量对象,你可以使用.item()
来获取到其中的数值
1 | x=torch.randn(1) |
tensor([0.0375])
0.037461359053850174
稍后阅读:将近100+种张量操作符,包括transposing,indexing,slicing, mathematical operations, linear algebra,random numbers等,可以在此处找到Here
3. Numpy 桥接
从Torch张量到Numpy向量之间的相互转换非常的简单
Torch张量和Numpy向量直接共享底层的内存地址,对其中之一做改动都会影响到另一个
1 | a = torch.ones(5) |
tensor([1., 1., 1., 1., 1.])
3.1 从Torch张量转Numpy向量
1 | b=a.numpy() |
[1. 1. 1. 1. 1.]
检查一下torch数值变化以后numpy向量的变化
1 | a.add_(1) |
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
3.2 从Numpy向量转换为Torch张量
同样检查np数据的变化所对应带来的Torch张量的变化
1 | import numpy as np |
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
注意:除了ChatTensor以外,其他所有类型的Tensor都支持转换为Numpy形式返回
4. CUDA向量
张量可以使用.to
方法转移到任意一个设备中
1 | # 注意此部分仅仅在CUDA加速运行时存在时可用 |
1 | tensor([-0.7816], device='cuda:0') |
本文标题:PyTorch入门一-PyTorch与numpy
文章作者:Hao Wang
发布时间:2019-04-10
最后更新:2022-06-19
原始链接:https://blog.waynehfut.com/2019/04/10/torch1/
版权声明:Copyright (C) 2022
分享