PyTorch快速入门

PyTorch 简介

详细的PyTorch教程可以去PyTorch官网的学习指南进一步学习,下面主要对PyTorch做简单的介绍,能够快速入门。
首先PyTorch是基于Python的科学计算类库,主要有以下两个方面的应用:

  1. 作为Numpy的替代者,充分利用GPU的计算能力。
  2. 提供一个灵活、快速的深度学习平台。

1.Tensor

Tensor 与Numpy的N维数组相似,另外还可以在GPU上使用张量来加速计算。

from __future__ import print_function
import torch

构建一个5*3的未初始化的矩阵

x = torch.empty(5,3)
print(x)

tensor([[2.7712e+35, 4.5886e-41, 7.2927e-04],
[3.0780e-41, 3.8725e+35, 4.5886e-41],
[4.4446e-17, 4.5886e-41, 3.9665e+35],
[4.5886e-41, 3.9648e+35, 4.5886e-41],
[3.8722e+35, 4.5886e-41, 4.4446e-17]])

构建一个随机初始化的矩阵:

x = torch.rand(5,3)
print(x)

tensor([[ 0.4217, 0.2846, 0.9913],
[ 0.8746, 0.0236, 0.4789],
[ 0.5481, 0.6883, 0.8226],
[ 0.0092, 0.2270, 0.4415],
[ 0.1383, 0.0734, 0.1277]])

构建一个元素类型为long且元素值为0的矩阵:

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([[3.3,12],[3,5]])
print(x)

tensor([[ 3.3000, 12.0000],
[ 3.0000, 5.0000]])

基于现有的tensor来建立一个tensor。这个方法将复用源tensor的属性(如:dtype等),除非知道提供一个新的值

x = x.new_ones(5,3,dtype=torch.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.8084, 1.5661, -0.1017],
[ 3.1705, -0.7630, -2.3282],
[-1.3905, -0.0371, -0.4802],
[-0.4614, -0.1850, 0.0266],
[-0.0259, 2.7221, -0.8667]])

获得Size:

print(x.size())

torch.Size([5, 3])

提示

torch.size实际是tuple,它支持tuple所有的运算。

运算
有很多运算法则。在接下来的例子中,我们将浏览一下加法运算。

加法:语法1

y = torch.rand(5,3)
print(x+y)

tensor([[ 1.5992, 0.1308, 0.9808],
[-0.3881, 1.5539, 2.3827],
[ 0.5378, 0.0299, 1.0226],
[-0.3838, 0.9908, 0.0008],
[ 1.4833, 0.8037, -0.5720]])

加法:语法2

print(torch.add(x,y))

tensor([[ 1.5992, 0.1308, 0.9808],
[-0.3881, 1.5539, 2.3827],
[ 0.5378, 0.0299, 1.0226],
[-0.3838, 0.9908, 0.0008],
[ 1.4833, 0.8037, -0.5720]])

加法:作为输出参数

result = torch.empty(5,3)
torch.add(x,y,out=result)
print(result)

tensor([[ 1.5992, 0.1308, 0.9808],
[-0.3881, 1.5539, 2.3827],
[ 0.5378, 0.0299, 1.0226],
[-0.3838, 0.9908, 0.0008],
[ 1.4833, 0.8037, -0.5720]])

加法:内联

y.add_(x)

print(y)

tensor([ 0.3145, -0.4335, 1.6005, 1.6027, 1.0676, 0.5858, -0.6781, -0.0365, 1.2611, 1.2395, 1.3665, 1.1841, 3.5654, -0.2450,-0.2146, -0.4243])

a = y.size()
print(a)

torch.Size([16])

提示

任何改变张量的操作都是固定有“”。例如:x.copy(y),x.t_(),都会改变x的值。

你可以使用标准的类似Numpy的行列索引。

print(x[:,1])

tensor([-0.2800, 1.1224, -0.4513, 0.8686, 0.1282])

变换大小:如果你想改变调整大小/改造张量,你可以使用 torch.view:

x = torch.randn(4,4)
y = x.view(16)
z = x.view(-1,8)
print(x.size(),y.size(),z.size())
 torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

如果你有一个一个元素的tensor,可以使用 .item() 获得其中的数字。

Tensor有包括 转置、索引、切片、数学操作、线性代数、随机数等100多种运算,具体详见Torch

x = torch.randn(1)
print(x)
print(x.item())

tensor([ 0.8017])
0.8016660213470459

NumPy Bridge
将Torch Tensor 转换成NumPy 数组,反之亦然。 Torch Tensor和NumPy 数组是共享内存,修改其中一个的值,那么另外一个的值也会改变。

将Tensor转换成 NumPy Array

a = torch.ones(5)
print(a)

tensor([ 1., 1., 1., 1., 1.])

b= a.numpy()
print(b)

[ 1. 1. 1. 1. 1.]
观察numpy array的值会被改变。

a.add_(1)
print(a)
print(b)

tensor([ 2., 2., 2., 2., 2.])
[ 2. 2. 2. 2. 2.]

将NumPy Array 转换成Tensor
观察numpy array如何自动转换成 Torch Tensor

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)

猜你喜欢

转载自blog.csdn.net/mrjkzhangma/article/details/89930768