王者荣耀为什么这么火 PyTorch 这么火

PyTorch入门:手把手教你用pytorch搭建一个简单的卷积神经网络 - 简书
PyTorch入门:手把手教你用pytorch搭建一个简单的卷积神经网络
PyTorch发布已经有段时间了,最近越来越火,但周围用的人不是很多,很多人已经用习惯了Caffe或者TensorFlow。其实PyTorch还是很有吸引力和竞争力的,相信会有越来越多的人转移到PyTorch阵营来。PyTorch的优点比较明显,首先安装起来很方便,根据系统环境选择pip安装或者conda安装(如果你系统安装了Anaconda环境),如果使用GPU需要先安装CUDA,根据版本选择即可,免去了类似安装Caffe依赖库、编译caffe的很多麻烦,如下图:
第二个很大的优点便是简洁易用,今天和大家一起来探讨一下如何用PyTorch来实现一个简单的卷积神级网络。首先是准备数据,PyTorch准备数据有很多灵活的方式,在最后能够将数据转为Numpy数组即可,通过Numpy数据可以转化为PyTorch所需的Tensor。因此,对于图像数据,可以直接通过opencv,Pillow等做处理;语音数据可以通过scipy和librosa来处理成numpy;文本数据可以通过CNTK之类的自然语言处理库处理成numpy数组。今天会提供一个处理自己数据的样例,但最后网络所用的训练数据采用MNIST。以下是一个简单的将图像数据转换为Numpy数组数据的样例,在模型中调用加载处理好的数据,并转为Tensor就可以实现自己数据的训练:
对于MNIST,PyTorch官方封装了加载数据的模块:torchvision.datasets.MNIST,大家可以去官网查看,这里同样会提供一个自己处理MNIST数据的样例,如下:
有了数据,接下来我们可以开始构建模型了,这里构建一个2层卷积,用过torch的人应该很熟悉,模型很简单也很明了:
模型构建完毕,就可以供训练和测试使用了,以下为训练和测试调用模型例子:
这里默认为CPU模型,如果需要使用GUP,需要将数据流和模型都加载到显存,调用*.cuda( )即可。接下来就是迭代训练和测试:
之后调用main函数就可以愉快的训练了。欢迎加入PyTorch交流群:欢迎关注深度学习公众号:深度智心从TensorFlow到PyTorch:九大深度学习框架哪款最适合你? | 电子创新网赛灵思中文社区Pytorch整理(一):60分钟入门 - 推酷
Pytorch整理(一):60分钟入门
由于种种奇怪的原因,近段时间开始尝试使用Pytorch。照着官方给的教程慢慢搞,稍微有一点点理解。在这里做一点小小的记录和翻译工作。
官方地址:
感谢作者:
这个教程的目标:
更高层次地理解Pythrch的Tensor库以及神经网络。
训练一个小的神经网络模型用于分类图像。
什么是Pytorch
这是一个基于Python的科学计算包,主要针对两类人群:
替代Numpy以发挥GPU的强大能力
一个提供最大灵活性和速度的深度学习研究平台
Tensors类似于numpy的ndarray,但是带了一些附加的功能,例如可以使用GPU加速计算等等。
import torch
构建一个未初始化的 5x3 矩阵:
x = torch.Tensor(5, 3)
1.00000e-28 *
[torch.FloatTensor of size 5x3]
构建一个随机初始化的矩阵:
x = torch.rand(5, 3)
[torch.FloatTensor of size 5x3]
获取矩阵维度大小:
print(x.size())
torch.Size([5, 3])
torch.Size 实际上是一个元组,因此它支持相同的操作。
运算操作有多种语法,让我们看看加法的例子。
加法:语法1
y = torch.rand(5, 3)
print(x + y)
[torch.FloatTensor of size 5x3]
加法:语法2
print(torch.add(x, y))
[torch.FloatTensor of size 5x3]
加法:给定一个输出tensor
result = torch.Tensor(5, 3)
torch.add(x, y, out=result)
print(result)
[torch.FloatTensor of size 5x3]
加法:就地
# adds x to y
[torch.FloatTensor of size 5x3]
任何就地改变一个tensor的操作都以 _ 为后缀。例如: x.copy_(y) , x.t_() ,都会改变 x 。
你可以像numpy一样使用索引!
print(x[:, 1])
[torch.FloatTensor of size 5]
延伸阅读:
100+ Tensor运算,包括转置、索引、切分、数学运算、线性代数随机数等等,链接:
Numpy的桥梁
Torch的Tensor和Numpy的数组之间的互转简直像一阵清风一样。
Torch的Tensor和Numpy的数组会共享它们的底层存储位置,该变其中一个,另外一个也会改变。
将Torch Tensor转换为Numpy数组
a = torch.ones(5)
[torch.FloatTensor of size 5]
b = a.numpy()
看看当改变numpy数组的值时发生了什么。
[torch.FloatTensor of size 5]
将Numpy数组转换为Torch Tensor
看看更改Numpy数组的同时自动地更改了Torch Tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
[torch.DoubleTensor of size 5]
除了CharTensor之外,CPU上的所有Tensor都支持与Numpy数组的来回转换。
CUDA Tensors
可以使用 .cuda 函数将Tensor转移到GPU上。
# let us run this cell only if CUDA is available
if torch.cuda.is_available():
x = x.cuda()
y = y.cuda()
Autograd:自动求导
Pytorch中所有神经网络的中心部分是 autograd 包。我们首先浏览一下它,然后再构建我们的第一个神经网络。
autograd 包为Tensor上的所有运算提供了自动求导功能。它是一个由运行定义的框架,即你的反向传播是由你的代码如何运行来决定的,而且每一轮迭代都可能是不同的。
让我们用几个简单的例子来了解几个简单的术语。
Variable 变量
autograd.Variable 是这个包的中心类。它包装一个Tensor,并且支持几乎所有定义在这个Tensor上的运算。一旦你完成了你的计算,你可以调用 .backward() 来自动地计算全部的梯度。
你可以通过 .data 属性来访问最原始的tensor,而梯度则相应地被累计到了 .grad 中。
autograd的实现中还有一个非常重要的类- Function 。
Variable 和 Function 是相互关联的并且构建了一个非循环图,其中编码了整个的计算历史。每一个变量都有一个 .creator 属性,它引用一个常见 Variable 的 Function (除了用户创建的Variables-它们的 creator是None )。
如果你想计算导数,可以在 Variable 上调用 .backward() 。如果 Variable 是个标量(一个单元素数据),那么你不用为 backward() 指定任何参数,然而如果它有多个元素,你需要指定一个 grad_output 参数,它是一个匹配尺寸的tensor。
import torch
from torch.autograd import Variable
创建一个变量:
x = Variable(torch.ones(2, 2), requires_grad=True)
Variable containing:
[torch.FloatTensor of size 2x2]
对变量进行运算:
Variable containing:
[torch.FloatTensor of size 2x2]
y 是作为一个运算操作的结果而创建的,因而它有一个creator
print(y.creator)
&torch.autograd._functions.basic_ops.AddConstant object at 0x108ada4a8&
在y上做更多的运算:
z = y * y * 3
out = z.mean()
print(z, out)
Variable containing:
[torch.FloatTensor of size 2x2]
Variable containing:
[torch.FloatTensor of size 1]
Gradients 梯度
让我们使用反向传播 out.backward() ,它等同于 out.backward(torch.Tensor([1.0])) 。
out.backward()
打印梯度 d(out)/dx:
print(x.grad)
Variable containing:
[torch.FloatTensor of size 2x2]
你应该会得到一个 4.5 的矩阵。让我们称 out 变量为 o 。我们有$o = \frac{1}{4}\sum_i z_i$,$z_i = 3(x_i+2)^2$ 以及 $ z_i\bigr\rvert_{x_i=1} = 27 $ 。因此,$\frac{\partial o}{\partial x_i} = \frac{3}{2}(x_i+2)$,从而$\frac{\partial o}{\partial x_i}\bigr\rvert_{x_i=1} = \frac{9}{2} = 4.5$。
你还可以使用autograd做一些疯狂的事情!
x = torch.randn(3)
x = Variable(x, requires_grad=True)
while y.data.norm() & 1000:
Variable containing:
[torch.FloatTensor of size 3]
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)
Variable containing:
[torch.FloatTensor of size 3]
延伸阅读:
Variable 和 Function 的文档:
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 王者荣耀为什么这么火 的文章

 

随机推荐