Pytorch入门演练
【引言】Pytorch是一个基于Python的科学计算软件包,有以下两种定位:
可以使用多GPU加速的NumPy替代品
提供最大限度灵活性与速度的深度学习研究平台
一、入门
1.Tensors(张量)
Tensors(张量)类似于NumPy中的ndarray,另外它还可以使用GPU加速计算。
from__future__import print_function importtorch
构造一个未初始化的5x3矩阵:
x = torch.empty(5, 3) print(x)
输出:
tensor([[-9.0198e-17, 4.5633e-41, -2.9021e-15], [ 4.5633e-41, 0.0000e+00, 0.0000e+00], [ 0.0000e+00, 0.0000e+00, 0.0000e+00], [ 0.0000e+00, 0.0000e+00, 0.0000e+00], [ 0.0000e+00, 0.0000e+00, 0.0000e+00]])
构造一个随机初始化的矩阵:
x = torch.rand(5, 3) print(x)
输出:
tensor([[0.1525, 0.7689, 0.5664], [0.7688, 0.0039, 0.4129], [0.9979, 0.3479, 0.2767], [0.9580, 0.9492, 0.6265], [0.2716, 0.6627, 0.3248]])
构造一个使用零填充、数据类型为long(长整型)的5X3矩阵:
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]])
直接用一组数据构造Tensor(张量):
x = torch.tensor([5.5, 3]) print(x)
输出:
tensor([5.5000, 3.0000])
或者根据现有的Tensor(张量)创建新的Tensor(张量)。除非用户提供新值,否则这些方法将重用输入张量的属性,例如dtype:
x = x.new_ones(5, 3, dtype=torch.double) # 使用new_* 方法设定维度 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.4228, 0.3279, 0.6367], [ 0.9233, -0.5232, -0.6494], [-0.1946, 1.7199, -0.1954], [ 0.1222, 0.7204, -1.3328], [ 0.1230, -0.5800, 0.4562]])
输出它的大小:
print(x.size())
输出:
torch.Size([5, 3])
【注意:torch.Size 实际上是一个元组,因此它支持所有元组操作。】
- 运算
Tensor运算有多种语法。在下面的示例中,我们将先示例加法运算。
加法运算:语法1
y = torch.rand(5, 3) print(x + y)
输出:
tensor([[ 0.0732, 0.9384, -0.2489], [-0.6905, 2.1267, 3.0045], [ 0.6199, 0.4936, -0.0398], [-2.0623, -0.5140, 1.6162], [ 0.3189, -0.0327, -0.5353]])
加法运算:语法2
print(torch.add(x, y))
输出:
tensor([[ 0.0732, 0.9384, -0.2489], [-0.6905, 2.1267, 3.0045], [ 0.6199, 0.4936, -0.0398], [-2.0623, -0.5140, 1.6162], [ 0.3189, -0.0327, -0.5353]])
加法运算:使用输出Tensor(张量)作为参数
result = torch.empty(5, 3) torch.add(x, y, out=result) print(result)
输出:
tensor([[ 0.0732, 0.9384, -0.2489], [-0.6905, 2.1267, 3.0045], [ 0.6199, 0.4936, -0.0398], [-2.0623, -0.5140, 1.6162], [ 0.3189, -0.0327, -0.5353]])
加法运算:内联接
# adds x to y y.add_(x) print(y)
输出:
tensor([[ 0.0732, 0.9384, -0.2489], [-0.6905, 2.1267, 3.0045], [ 0.6199, 0.4936, -0.0398], [-2.0623, -0.5140, 1.6162], [ 0.3189, -0.0327, -0.5353]])
【注意:任何改变原张量实现内联接的操作都是通过在后边加_ 实现的。例如:x.copy_(y),x.t_(),将将改变x的值。】
你可以像在NumPy中一样使用索引及其他所有华丽的功能。
print(x[:, 1])
输出:
tensor([ 0.3279, -0.5232, 1.7199, 0.7204, -0.5800])
Resizing(调整大小):如果要resize/reshape张量,可以使用torch.view:
x = torch.randn(4, 4) y = x.view(16) z = x.view(-1, 8) # -1是推断出来的 print(x.size(), y.size(), z.size())
输出:
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
如果你有只含一个元素的张量,可以用.item()获取它的值作为Python数值
x = torch.randn(1) print(x) print(x.item())
输出:
tensor([0.1550]) 0.15495021641254425
【延伸阅读:100+张量操作,包括置换,索引,切片,数学运算,线性代数,随机数等等,被详细描述在这里
(https://pytorch.org/docs/torch)。】
二、NUMPY桥接器
将Torch Tensor转换为NumPy array是一件轻而易举的事(反之亦然)。Torch Tensor和NumPyarray共享其底层内存位置,更改一个将改变另一个。
1.将Torch 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.]
了解numpyarray的值如何变化。
a.add_(1) print(a) print(b)
输出:
tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]
- 将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)
输出:
[2. 2. 2. 2. 2.] tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
除了Char(字符型)Tensor之外,CPU上的所有Tensors都支持转换为NumPy及返回。
三、CUDA TENSORS(张量)
可以使用.to方法将张量移动到任何设备上。
# 仅当CUDA可用的情况下运行这个cell # 我们用 ``torch.device`` 对象实现tensors在GPU上的写入与读出if torch.cuda.is_available(): device = torch.device("cuda") # 一个 CUDA 终端对象 y = torch.ones_like(x, device=device) # 直接在GUP上创建Tensor x = x.to(device) # 或者直接使用字符串`.to("cuda")`` z = x + y print(z) print(z.to("cpu", torch.double)) # `.to`` 也可以改变对象数据类型
输出:
tensor([2.4519], device='cuda:0') tensor([2.4519], dtype=torch.float64)
原文发布时间为:2018-12-19
本文作者:磐石
本文来自云栖社区合作伙伴“ 磐创AI”,了解相关信息可以关注“
xunixs”微信公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
史上最全的高可用服务系统线上问题排查工具单(一)
上一篇文章保证高可用Java服务化系统高效运行的必备工具箱介绍了笔者在互联网公司里线上应急和技术攻关过程中积累的应用层脚本和Java虚拟机命令,这些脚本和命令在发现问题和定位问题的过程中起到关键作用,然而,经常会遇到一些深层次的问题,仅仅通过应用层和JVM虚拟机层的信息无法定位问题和解决问题,这时需要深入研究系统级的各种参数和信息,才能确定问题的根源原因,例如:网络超时、机器负载过高、JVM OOM、JVM和内核Bug等,这篇文章介绍那些重要的Linux基础和监控相关的命令。 本文并不是介绍Linux命令的手册,而是侧重于命令在特定场景下如何帮助应急人员和攻关人员定位问题并解决问题,因此,对于每个命令的介绍将直切主题,直接介绍命令使用的具体场景,而不是介绍命令的详细使用格式。 01 必不可少的基础命令和工具_ 1、grepgrep是Linux下通用的文本内容查找命令。 也可以利用它打印匹配的上下几行,线上查找问题的时候,可以使用下列命令,查找关键字,显示关键字出现行的后5行,并且给关键字着色。使用方式: grep -5 'parttern' INPUT_FILE #打印匹配行的前后5行...
- 下一篇
python 函数 reduce、filter
## reduce >>> reduce(lambda x,y: x+y,[1,2,3,4,5]) 15 请看官仔细观察,是否能够看出是如何运算的呢?画一个图: 还记得map是怎么运算的吗?忘了?看代码: >>> list1 = [1,2,3,4,5,6,7,8,9] >>> list2 = [9,8,7,6,5,4,3,2,1] >>> map(lambda x,y: x+y, list1,list2) [10, 10, 10, 10, 10, 10, 10, 10, 10] 对比一下,就知道两个的区别了。原来map是上下运算,reduce是横着逐个元素进行运算。 权威的解释来自官网: reduce(function, iterable[, initializer]) Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块