【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换

本系列介绍了入门PyTorch所需要了解的内容。本文主要参考文献:《Deep Learning with PyTorch: A 60 Minute Blitz》(PyTorch深度学习60分钟快速入门),更新于2019.06.06。

文章目录

  • 什么是PyTorch
  • 安装
  • Tensors(张量)
    • 定义一个Tensor
      • 1. 定义一个尺寸为5x3的未初始化矩阵
      • 2. 定义一个尺寸为5x3的随机初始化的矩阵
      • 3. 定义一个0初始化的数据类型为long的矩阵
      • 4. 以数据或现存tensor定义一个tensor
      • 5. 获取tensor尺寸
    • 操作
      • 加法语法1
      • 加法语法2
      • 加法语法:给定输出tensor
      • 原位相加(替换tensor原始数值)
      • 尺度变化
      • 获取Python格式数据
      • 更多操作
    • NumPy转换
      • 将Torch Tensor转换成NumPy Array
      • 将NumPy Array转换成Torch Tensor
    • CUDA Tensors

什么是PyTorch

PyTorch是一个基于Python的科学计算包(scientific computing package),主要实现两个目的:

  • 为发挥GPU效果而替代NumPy;
  • 提供灵活性和速度的深度学习研究平台。

安装

入门PyTorch首先要将其安装在电脑上。打开官网,在下图中依次点击选择适合电脑环境的配置。

【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第1张图片
第一个PyTorch Build选项,如果没有特殊需要,建议选择Stable。第二行为系统,根据电脑系统选择即可。
第三行,如果没有特殊需要,安装包建议通过Conda或者Pip安装,比较稳定。
第四行,选择编程语言(Python或C++)。
第四行,如果有GPU的话,选择GPU上安装的CUDA版本;如果没有安装CUDA,选择None。

都选好以后,复制最下面一行Run this Command后面显示的安装命令,在终端运行即可。

Tensors(张量)

Tensors与NumPy中的ndarrays很相似,区别在于Tensors可以支持GPU上的加速计算。

定义一个Tensor

本节给出了定义Tensor中的各类命令。首先打开终端,输入Python进入Python界面
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第2张图片

1. 定义一个尺寸为5x3的未初始化矩阵

输入命令:

import torch

x = torch.empty(5,3)	#定义一个未初始化的tensor
print(x)		#查看tensor

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第3张图片

2. 定义一个尺寸为5x3的随机初始化的矩阵

输入命令:

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

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第4张图片

3. 定义一个0初始化的数据类型为long的矩阵

输入命令:

x = torch.zeros(5,3,dtype=torch.long)
print(x)

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第5张图片

4. 以数据或现存tensor定义一个tensor

输入命令:

x = torch.tensor([5.5,3])
print(x)

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第6张图片

或者也可以基于现存的tensor创建新的tensor。

除非用户提供了新的值,否则这些方法会复用输入tensor的性质,比如dtype

输入命令:

x = x.new_ones(5,3,dtype=torch.double		# new_*方法获得尺寸
print(x)

x = torch.randn_like(x,dtype=torch.float)		#替换dtype
print(x)		# 结果具有相同的尺寸

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第7张图片
注:这里用到了new_onesrandn_like两个函数,torch中还存在两个与它们很相似的函数,分别为torch.onestorch.randn。对应函数之间的功能其实是相同的,只不过前两个可以从已有tensor的基础上快速生成与之属性相同的新tensor;而后两个函数则是直接定义一个新的tensor。

后两个函数的示例如下:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第8张图片

5. 获取tensor尺寸

输入命令:

print(x,size())

终端结果:
在这里插入图片描述
需要注意的是,这里返回的torch.Size其实是一个tuple类型的数据,因此支持所有tuple操作。

操作

操作语法有很多,这里以求“相加”为例。

加法语法1

输入命令:

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

终端结果(已根据前面定义好了x):
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第9张图片

加法语法2

输入命令:

print(torch.add(x,y))

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第10张图片

加法语法:给定输出tensor

输入命令:

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

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第11张图片

原位相加(替换tensor原始数值)

输入命令:

y.add_(x)		#将x加到y上
print(y)

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第12张图片

注: 原位改变tensor的操作都会在词尾加一个_,比如x.copy_(y)x.t_(),都会改变x的值。其中,.t()操作的作用是,将tensor重新排布,使其行数最小。

也可以用类似NumPy的标准下标实现所有附加功能。输入命令:

print(x[:,1])

终端结果:

在这里插入图片描述

尺度变化

可以用torch.view实现大小和形状的调整(但元素总数需要前后一致)。输入命令:

x = torch.randn(4,4)		#与torch.rand的区别是,torch.rand服从均匀分布,torch.randn服从正态分布
y = x.view(16)
z = x.view(-1,8)		#尺寸-1代表根据其他维度自动调整
print(x.size(), y.size(), z.size())

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第13张图片

获取Python格式数据

如果tensor中只有一个元素,可以用.item()获取Python格式的数据:

输入命令:

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

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第14张图片
注意,这个命令只能对单一元素的tensor使用。

更多操作

包括转置、下标、切片、数学操作、线性变换、随机数等100多个tensor操作可以看这里。

NumPy转换

将Torch张量(tensor)与NymPy的数组(array)相互转换也是很容易的。如果Torch Tensor在CPU上的话,Torch Tensor和NumPy array共享底层存储位置,并且可以互相转换。

将Torch Tensor转换成NumPy Array

输入命令:

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

b = a.numpy()
print(b)

终端结果:

【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第15张图片

查看NumPy array如何随tensor变换值。输入命令:

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

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第16张图片

将NumPy Array转换成Torch Tensor

np 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)

终端结果:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第17张图片

所有CPU上的Tensor(除了CharTensor)都支持与NumPy之间的相互转换。

CUDA Tensors

Tensors也可以通过.to命令移动到任何设备上。输入命令:

# 只在CUDA存在时运行这个模块
# 使用 ``torch.device`` 将tensor移入和移出GPU
if torch.cuda.is_available():
    device = torch.device("cuda")          # 一个目标设备CUDA
    y = torch.ones_like(x, device=device)  # 直接在GPU上创建一个tensor
    x = x.to(device)                       # or just use strings ``.to("cuda")``
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # ``.to`` 命令也可以同时转换dtype

终端输出:
【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换_第18张图片

脚本总运行时间:6.503秒。

更多内容,欢迎加入星球讨论。

你可能感兴趣的:(【PyTorch入门】(一)PyTorch安装、Tensor理解、与NumPy互相转换)