PyTorch 60分钟入门系列之PyTorch简介
时间:2022-07-22
本文章向大家介绍PyTorch 60分钟入门系列之PyTorch简介,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
PyTorch简介
这是一个基于Python的科学计算包,主要针对两类人群:
- 替代Numpy以发挥GPU的强大能力
- 一个提供最大灵活性和速度的深度学习研究平台
基础
张量(Tensors)
Tensors类似于numpy的ndarray,但是带了一些附加的功能,例如可以使用GPU加速计算等等。
from __future__ import print_function
import torch
构建一个未初始化的5*3的矩阵:
x = torch.empty(5, 3)
print(x)
tensor([[-1.0593e-05, 4.5849e-41, 3.4723e-37],
[ 0.0000e+00, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 7.1941e+28],
[ 3.1036e+27, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 3.4568e-37]])
构建一个随机初始化的5*3的矩阵:
x = torch.rand(5, 3)
print(x)
tensor([[ 0.7556, 0.7558, 0.2999],
[ 0.7304, 0.3527, 0.1911],
[ 0.8654, 0.4880, 0.1987],
[ 0.5456, 0.9359, 0.2071],
[ 0.1025, 0.5249, 0.3758]])
构建一个初始化为零类型为long的5*3的矩阵:
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,除非用户提供了新的值
print(x) #打印之前的x值
x = x.new_ones(5, 3, dtype=torch.double) # new_* 方法可以更改x的值,维度和类型
print(x)
x = torch.randn_like(x, dtype=torch.float) # 类型与值进行覆盖
print(x) # 不改变维度
tensor([ 5.5000, 3.0000])
tensor([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]], dtype=torch.float64)
tensor([[-1.4230, -0.7907, -0.0556],
[-0.9403, -0.2937, 1.9447],
[ 0.2958, 0.9914, -0.9550],
[ 1.2439, -0.1390, 0.2889],
[-0.1790, -0.0003, 0.5241]])
获取尺寸
print(x.size())
torch.Size([5, 3])
torch.Size 实际上是一个元组(tuple),因此它支持所有的元祖(tuple)的操作。
操作(Operations)
Pytorch具有100多种操作符(加减乘除,转置,索引,切片,等等),在这里我们以最简单的加法操作,了解Pytorch的操作方法。
- 加法:语法1
y = torch.rand(5, 3)
print(x + y)
tensor([[-1.1514, -0.5880, -0.0083],
[-0.4967, 0.2964, 2.5860],
[ 0.7163, 1.0643, 0.0210],
[ 1.8021, 0.6697, 0.8263],
[ 0.3601, 0.3765, 1.3859]])
- 加法:语法2
print(torch.add(x, y))
tensor([[-1.1514, -0.5880, -0.0083],
[-0.4967, 0.2964, 2.5860],
[ 0.7163, 1.0643, 0.0210],
[ 1.8021, 0.6697, 0.8263],
[ 0.3601, 0.3765, 1.3859]])
- 加法:提供输出张量作为参数
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
tensor([[-1.1514, -0.5880, -0.0083],
[-0.4967, 0.2964, 2.5860],
[ 0.7163, 1.0643, 0.0210],
[ 1.8021, 0.6697, 0.8263],
[ 0.3601, 0.3765, 1.3859]])
- 加法:就地解决((in-place))
# adds x to y
y.add_(x)
print(y)
tensor([[-1.1514, -0.5880, -0.0083],
[-0.4967, 0.2964, 2.5860],
[ 0.7163, 1.0643, 0.0210],
[ 1.8021, 0.6697, 0.8263],
[ 0.3601, 0.3765, 1.3859]])
任何就地改变一个tensor的操作都以
_
为后缀。例如:x.copy_(y)
,x.t_()
,都会改变x。
Numpy与Torch张量的相互转换
Torch的Tensor和Numpy的数组会共享它们的底层存储位置,改变其中一个,另外一个也会改变。
Torch张量转换成Numpy数组
a = torch.ones(5) # 创建一个torch张量
print(a)
b = a.numpy() # 将torch张量转化为numpy数组
print(b)
a.add_(1) # 就地改变torch张量的值
print(a) # a torch张量发生改变
print(b) # b numpy数组因为共享底层存储所以也同时改变
tensor([ 1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
tensor([ 2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
Numpy数组T转换成orch张量
import numpy as np #导入numpy
a = np.ones(5) #创建numpy数组
b = torch.from_numpy(a) #numpy转化成torch张量
np.add(a, 1, out=a) #numpy数组数据加一
print(a) # numpy数组发生变化
print(b) # torch张量因为与numpy共享底层存储因此也发生变化
[2. 2. 2. 2. 2.]
tensor([ 2., 2., 2., 2., 2.], dtype=torch.float64)
CUDA张量(CUDA Tensors)
可以使用.to方法将张量移动到任何设备上。
# 我们使用 ``torch.device`` 对象 将张量移入和移出GPU
if torch.cuda.is_available():
device = torch.device("cuda") # 一个CUDA设备对象
y = torch.ones_like(x, device=device) # 直接在GPU上创建一个张量对象
x = x.to(device) # 或者使用``.to("cuda")``
z = x + y
print(z)
print(z.to("cpu", torch.double)) # ``.to`` 将结果转回cpu存储,还可以改变数据类型
tensor([[-0.4230, 0.2093, 0.9444],
[ 0.0597, 0.7063, 2.9447],
[ 1.2958, 1.9914, 0.0450],
[ 2.2439, 0.8610, 1.2889],
[ 0.8210, 0.9997, 1.5241]], device='cuda:0')
tensor([[-0.4230, 0.2093, 0.9444],
[ 0.0597, 0.7063, 2.9447],
[ 1.2958, 1.9914, 0.0450],
[ 2.2439, 0.8610, 1.2889],
[ 0.8210, 0.9997, 1.5241]], dtype=torch.float64)
参考
Deep Learning with PyTorch: A 60 Minute Blitz(https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html)
- 微信版12306来了!用12306微信小程序买票靠谱吗
- 无需写try/catch,也能正常处理异常
- “人工智能毁灭人类”是一种末世恐惧传染病
- 有状态(Stateful)应用的容器化
- 实现一些字符串操作标准库函数、解决一些字符串问题
- 外卖陷阱,你入坑了么?
- ASP.NET Core的配置(4):多样性的配置来源[上篇]
- 37 个你必须知道的现代数据中心术语
- Python读书笔记7
- 2017年人工智能在游戏领域打败人类,未来我们将何去何从?
- 3杂再破市场行情 6位数结拍
- 将永久存储添加到Red Hat CDK Kit 3.0
- ASP.NET MVC的Razor引擎:RazorView
- 三分钟学会 Java 单元测试
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Vue3 DOM Diff 核心算法解析
- PHP的LZF压缩扩展工具
- Python函数定义及参数详解
- 代码失而复得心塞往事 - git stash命令
- 如何通过 Shell 监控异常等待事件和活跃会话
- PHP中环境变量的操作
- 一文读懂JAVA并发容器类ConcurrentHashMap
- Creator3D新版本震撼来袭
- SpringBoot源码学习(十)-Spring类级别注解解析原理
- 从安全切面到Security Mesh
- SpringBoot源码学习(十一) - bean的实例化过程
- 每天一杯力扣快乐水
- Typescript的tsconfig.json
- python和R语言计算蛋白质内部氨基酸相互作用
- 超文本传输协议 - 白话篇