PyTorch学习—PyTorch是什么?

来源:互联网 发布:搜索引擎 数据库 区别 编辑:程序博客网 时间:2024/05/16 12:12

引言
PyTorch是一个Python的深度学习框架,最近越来越火,大有要赶超Tensorflow的势头。当然这是我听别人说的,我这个外行人就不敢乱评论了(不敢吭声.jpg)
PyTorch 的安装,在这就不说明了,总之我是百度了不少博客经验之类的网页,才终于磕磕碰碰地把 PyTorch 安装成功。听大部分人说, PyTorch 目前只支持 linux 和 osx 系统,而我用的是 windows ,所以只能开vmware,在虚拟机上的 ubuntu 装。我主要是参考 Pytorch安装-pip安装方案 这个大神的方法安装的。
这页博客是用来记录学习 PyTorch 的官方教程里“60分钟入门深度学习PyTorch”的进程:Deep Learning with PyTorch: A 60 Minute Blitz

PyTorch是什么?
是一个主要拥有如下两种功能的基于python的科学计算包:

  • 在使用GPU时作为numpy库的替代品
  • 提供最大程度的灵活度和速度的深度学习研究平台

开始

Tensor
Tensor与numpy中的ndarray’s 相似,并且tensor比ndarray多了一个功能:它可以使用GPU去进行计算机的计算

from __future__ import print_functionimport torch

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

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

输出:

-1.6081e-14  1.5525e-41  8.8476e-38 0.0000e+00  1.0065e+17  0.0000e+00 2.8026e-45  1.5525e-41  1.0065e+17 0.0000e+00  4.6243e-44  0.0000e+00 8.1728e-38  0.0000e+00  1.0065e+17[torch.FloatTensor of size 5x3]

随机初始化一个5*3的矩阵

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

输出:

0.3129  0.9342  0.9616 0.7383  0.0806  0.4812 0.3423  0.0733  0.3207 0.6953  0.9285  0.1022 0.4641  0.7445  0.3699[torch.FloatTensor of size 5x3]

获取矩阵的行列大小值

print(x.size())

输出:

torch.Size([5, 3])

PS:torch.Size 实际上是一个元组,所以它提供同样的功能

操作
操作的语法有很多种,我们来看以下一个例子:
语法一

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

输出:

0.3917  1.8496  1.4277 1.1302  0.6874  1.3269 1.0373  0.1904  1.2058 0.9007  1.7532  0.6824 1.2130  1.4414  1.1531[torch.FloatTensor of size 5x3]

语法二

print(torch.add(x, y))

输出:

0.3917  1.8496  1.4277 1.1302  0.6874  1.3269 1.0373  0.1904  1.2058 0.9007  1.7532  0.6824 1.2130  1.4414  1.1531[torch.FloatTensor of size 5x3]

将输出结果赋予给一个tensor

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

输出:

0.3917  1.8496  1.4277 1.1302  0.6874  1.3269 1.0373  0.1904  1.2058 0.9007  1.7532  0.6824 1.2130  1.4414  1.1531[torch.FloatTensor of size 5x3]

也可以这样相加

# adds x to yy.add_(x)print(y)

输出:

0.3917  1.8496  1.4277 1.1302  0.6874  1.3269 1.0373  0.1904  1.2058 0.9007  1.7532  0.6824 1.2130  1.4414  1.1531[torch.FloatTensor of size 5x3]

PS:任何改变一个tensor的值的“替换”操作,都在其后面加一个小横杆 _ 例如,x.copy_(y) , x.t_() , 都会改变 x 的值。

“You can use standard numpy-like indexing with all bells and whistles!

你可以使用标准的numpy库,比如说索引一些很浮夸的东西!(这个句子翻译起来有点egg疼,希望英语大佬来帮忙改正)

print(x[:, 1])

输出:

0.9342 0.0806 0.0733 0.9285 0.7445[torch.FloatTensor of size 5]

PS:更多关于tensor的酷炫操作,在这里:click here

Numpy之桥
实现torch的tensor变量与numpy的数组变量之间的转换是轻而易举的事。
torch的tensor变量和numpy的数组变量的底层存储位置是共享的,这意味着改变其中一个的值,另一个也会随之改变

将torch的tensor转换成numpy的数组

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

输出:

1 1 1 1 1[torch.FloatTensor of size 5]
b = a.numpy()print(b)

输出:

[ 1.  1.  1.  1.  1.]

然后你会发现改变a的值,b的值也会随之改变

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

输出:

2 2 2 2 2[torch.FloatTensor of size 5][ 2.  2.  2.  2.  2.]

将numpy的数组转换成torch的tensor

import numpy as npa = np.ones(5)b = torch.from_numpy(a)np.add(a, 1, out=a)print(a)print(b)

输出(b随着a的改变也改变了):

[ 2.  2.  2.  2.  2.] 2 2 2 2 2[torch.DoubleTensor of size 5]

除了CharTensor之外,CPU上的Tensors都支持与NumPy之间的转换

CUDA Tensors
使用 .cuda 函数,tensors可以在GPU上运行

# let us run this cell only if CUDA is availableif torch.cuda.is_available():    x = x.cuda()    y = y.cuda()    x + y

原作者:Sphnix-Gallery