PyTorch的基本概念
一、什么是Pytorch,为什么选择Pytroch?
1. 什么是Pytorch
pytorch是一个基于Python的科学计算软件包,针对两组受众:
- NumPy的替代品,可以使用GPU的强大功能
- 深入学习研究平台,提供最大的灵活性和速度
PyTorch 是一个以Python 优先的深度学习框架,不仅能够实现强大的GPU 加速,同时还支持动态神经网络,这是现在很多主流框架比如Tensorflow 等都不支持的。
PyTorch 既可以看做加入了GPU 支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络,除了Facebook 之外,它还已经被Twitter、CMU 和Salesforce 等机构采用。
2. 为什么选择pytorch
面对如此多的深度学习框架,我们为何要选择PyTorch 呢?Tensorflow 不是深度学习框架默认的老大吗,为什么不直接选择Tensorflow 而是要选择PyTorch 呢?下面分4个方面来介绍为何要使用PyTorch。
(1)掌握一个框架并不能一劳永逸,现在深度学习并没有谁拥有绝对的垄断地位,就算是Google 也没有,所以只学习Tensorflow 并不够。同时现在的研究者使用各个框架的都有,如果你要去看他们实现的代码,至少也需要了解他们使用的框架,所以多学一个框架,以备不时之需。
(2)Tensorflow 与Caffe 都是命令式的编程语言,而且是静态的,首先必须构建一个神经网络,然后一次又一次使用同样的结构,如果想要改变网络的结构,就必须从头开始。但是对于PyTorch,通过一种反向自动求导的技术,可以让你零延迟地任意改变神经网络的行为,尽管这项技术不是PyTorch 独有,但目前为止它实现是最快的,能够为你任何疯狂想法的实现获得最高的速度和最佳的灵活性,这也是PyTorch 对比Tensorflow 最大的优势。
(3)PyTorch 的设计思路是线性、直观且易于使用的,当你执行一行代码时,它会忠实地执行,并没有异步的世界观,所以当你的代码出现Bug 的时候,可以通过这些信息轻松快捷地找到出错的代码,不会让你在Debug 的时候因为错误的指向或者异步和不透明的引擎浪费太多的时间。
(4)PyTorch 的代码相对于Tensorflow 而言,更加简洁直观,同时对于Tensorflow高度工业化的很难看懂的底层代码,PyTorch 的源代码就要友好得多,更容易看懂。深入API,理解PyTorch 底层肯定是一件令人高兴的事。一个底层架构能够看懂的框架,你对其的理解会更深。
最后,我们简要总结一下PyTorch 的特点:
- 支持GPU;
- 动态神经网络;
- Python 优先;
- 命令式体验;
- 轻松扩展。
二、Pytroch的安装
到这个网站根据硬件情况查看所需要安装的pytorch版本,然后用命令行安装
https://pytorch.org/get-started/locally/
三、配置Python环境
安装python解释器
四、准备Python管理器
安装anaconda,安装一些必要的包
五、通过命令行安装PyTorch
找到对应的pytorch安装命令,在命令行中输入进行安装
六、PyTorch基础概念
根据此网址学习pytorch基础知识
使用PYTORCH深度学习:60分钟闪电战
https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html
- tensor
tensor与NumPy的ndarray类似,另外还有Tensors也可用于GPU以加速计算。
from __future__ import print_function
import torch
#构造一个未初始化的5x3矩阵:
x = torch.empty(5, 3)
#构造一个随机初始化的矩阵:
x = torch.rand(5, 3)
#构造一个矩阵填充的零和dtype long:
x = torch.zeros(5, 3, dtype=torch.long)
#直接从数据构造张量tensor
x = torch.tensor([5.5, 3])
#或者根据现有的张量创建张量。除非用户提供新值,否则这些方法将重用输入张量的属性,例如dtype
x = x.new_ones(5, 3, dtype=torch.double)
print(x)
x = torch.randn_like(x, dtype=torch.float)
print(x)
#得到它的大小:
print(x.size()) #torch.Size 实际上是一个元组,因此它支持所有元组操作
- 各种操作
(1)增加
#增加:语法1
y = torch.rand(5, 3)
print(x + y)
#增加;语法2
print(torch.add(x, y))
#增加:提供输出张量作为参数
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
#增加:就地(in-place)
#add x to y
y.add(x)
print(y)
注意:任何使原位张量变形的操作都是用_后固定的。例如:x.copy_(y),x.t_(),将改变x。
#切片,输出x的第一列
print(x[:, 1])
(2)调整大小
如果要调整张量/重塑张量,可以使用torch.view
#调整大小:如果要调整张量/重塑张量,可以使用torch.view:
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) #大小-1是从其他维度推断出来的
print(x.size(), y.size(), z.size())
#如果你有一个元素张量,用于.item()获取值作为Python数字
x = torch.randn(1)
print(x)
print(x.item())
- NumPy Bridge
将Torch Tensor转换为NumPy阵列(反之亦然)是一件轻而易举的事。
Torch Tensor和NumPy阵列将共享其底层内存位置(如果Torch Tensor在CPU上),更改一个将改变另一个。
(1)将Torch Tensor转换为NumPy数组
#将Torch Tensor转换为NumPy数组
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
#输出结果
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
#了解numpy数组的值如何变化
a.add_(1)
print(a)
print(b)
#输出
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
(2)将NumPy数组转换为Torch Tensor
#将NumPy数组转换为Torch Tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.<