每过一段时间,总会有一个python库被开发出来,改变深度学习领域。而PyTorch就是这样一个库。

在过去的几周里,我一直在尝试使用PyTorch。我发现它非常好上手。迄今为止,在我所有的各种深度学习库中,PyTorch一直是最灵活和容易的。

在本文中,我们将探索PyTorch的实际应用,其中包括基础知识和案例研究。我们还将比较使用numpy和PyTorch构建的神经网络,以查看它们在实现中的相似之处。

PyTorch概述

PyTorch的创作者说他们信奉的道理是 – 解决当务之急。这意味着我们立即运行我们的计算。这恰好适合python的编程方法,因为我们不必等待所有代码都写完才能知道它是否有效。我们可以运行部分代码并实时检查它。对于我,一个神经网络调试器来说,这无意是一个福音!

PyTorch是一个基于python的库,旨在提供灵活的深度学习开发平台。PyTorch的工作流程很可能接近python的科学计算库 – numpy。

那么,为什么我们要使用PyTorch来构建深度学习模型?:易于使用的API – 如Python一样简单。

Python支持 – 如上所述,PyTorch平滑地与Python数据科学堆栈结合。它与numpy非常相似,你甚至很难注意到他们的差异。

动态计算图 – PyTorch并没有为特定功能预定义图形,而是为我们提供了一个框架,可以随时随地构建计算图,甚至在运行时更改计算图。我们不知道创建一个神经网络需要多少内存时,这非常有用。

使用PyTorch的还有其他的优点,它能够支持multiGPU,自定义数据加载和简化的预处理程序。

自2016年1月初发布以来,许多研究人员已将其作为一种实现库,因为它易于构建新颖甚至非常复杂的计算图。话虽如此,PyTorch仍然需要一段时间才能被大多数数据科学从业者所采用,因为它是新的并且正在建设中。

在深入细节之前,让我们了解PyTorch的工作流程。

PyTorch使用命令式/热切式范式。也就是说,构建图形的每行代码都定义了该图的一个组件。即使在图形完全构建之前,我们也可以独立地对这些组件进行计算。这被称为运行时定义(define-by-run)法。

安装PyTorch非常简单。您可以按照它的官方文档操作,并根据自己的系统规格运行命令。例如,下面是我根据我的情况使用的命令:

1conda install pytorch torchvision cuda91 -c pytorch

我们在开始使用PyTorch时应该了解的主要元素是:PyTorch张量

数学运算

Autograd模块

Optim模块

nn模块

PyTorch张量

张量不过是多维数组。PyTorch中的张量与numpy的ndarray相似,张量也可以在GPU上使用。PyTorch支持很多类型的张量。

你可以定义一个简单的一维矩阵如下:

1# import pytorch

2import torch

3

4# define a tensor

5torch.FloatTensor([2])

12

2[torch.FloatTensor of size1]

数学运算

与numpy一样,科学计算库需要高效的实现数学函数。PyTorch提供了一个相似的接口,可以使用超过200多种数学运算。

以下是PyTorch中一个简单加法操作的例子:

1a= torch.FloatTensor([2])

2b= torch.FloatTensor([3])

3

4a+ b

5

[torch.FloatTensor of size 1]

这看起来不像是一种quinessential python方法吗?我们也可以对我们定义的PyTorch张量执行各种矩阵运算。例如,我们将转置一个二维矩阵:

1matrix= torch.randn(3,3)

2matrix

1-1.3531 -0.5394 0.8934

2 1.7457 -0.6291 -0.0484

3-1.3502 -0.6439 -1.5652

4[torch.FloatTensor of size3x3]

1matrix.t()

1-2.1139 1.8278 0.1976

2 0.6236 0.3525 0.2660

3-1.4604 0.8982 0.0428

4[torch.FloatTensor of size3x3]

Autograd模块

PyTorch使用一种称为自动微分(automatic differentiation)的技术。也就是说,有一个记录我们所执行的操作的记录器,然后它会反向回放以计算我们的梯度。这种技术在建立神经网络时尤为有效,因为我们可以通过计算正向传递过程中参数的微分来节省一个周期的时间。

1from torch.autogradimport Variable

2

3x= Variable(train_x)

4y= Variable(train_y, requires_grad=False)

Optim模块

torch.optim 是一个实现构建神经网络的各种优化算法的模块。大多数常用的方法已经被支持,因此我们不必从头开始构建它们(除非你乐意这么做)。

以下是使用Adam优化的代码:

1optimizer= torch.optim.Adam(model.parameters(),lr= learning_rate)

nn模块

PyTorch的autograd模块可以很容易地定义计算图和梯度,但是默认的autograd对于定义复杂的神经网络可能有些低级。这时就要用到nn模块。

nn包定义了一组模块,我们可以将其视为一个神经网络层,它可以从输入生成输出,并且具有一些可训练的权重。

您可以将一个nn模块视为PyTorch 的keras!

1import torch

2

3# define model

4model= torch.nn.Sequential(

5 torch.nn.Linear(input_num_units, hidden_num_units),

6 torch.nn.ReLU(),

7 torch.nn.Linear(hidden_num_units, output_num_units),

8)

9loss_fn= torch.nn.CrossEntropyLoss()

在Numpy与PyTorch建立一个神经网络的对比

我之前提到PyTorch和Numpy非常相似。那么,我们来看看为什么,一个简单的神经网络的实现来解决二元分类问题。使用Numpy如下:

01## Neural network in numpy

02

03import numpy as np

04

05#Input array

06X=np.array([[1,0,1,0],[1,0,1,1],[0,1,0,1]])

07

08#Output

09y=np.array([[1],[1],[0]])

10

11#Sigmoid Function

12def sigmoid (x):

13 return 1/(1 + np.exp(-x))

14

15#Derivative of Sigmoid Function

16def derivatives_sigmoid(x):

17 return x* (1 - x)

18

19#Variable initialization

20epoch=5000 #Setting training iterations

21lr=0.1 #Setting learning rate

22inputlayer_neurons= X.shape[1]#number of features in data set

23hiddenlayer_neurons= 3 #number of hidden layers neurons

24output_neurons= 1 #number of neurons at output layer

25

26#weight and bias initialization

27wh=np.random.uniform(size=(inputlayer_neurons,hiddenlayer_neurons))

28bh=np.random.uniform(size=(1,hiddenlayer_neurons))

29wout=np.random.uniform(size=(hiddenlayer_neurons,output_neurons))

30bout=np.random.uniform(size=(1,output_neurons))

31

32for iin range(epoch):

33 #Forward Propogation

34 hidden_layer_input1=np.dot(X,wh)

35 hidden_layer_input=hidden_layer_input1+ bh

36 hiddenlayer_activations= sigmoid(hidden_layer_input)

37 output_layer_input1=np.dot(hiddenlayer_activations,wout)

38 output_layer_input= output_layer_input1+ bout

39 output= sigmoid(output_layer_input)

40

41 #Backpropagation

42 E= y-output

43 slope_output_layer= derivatives_sigmoid(output)

44 slope_hidden_layer= derivatives_sigmoid(hiddenlayer_activations)

45 d_output= E* slope_output_layer

46 Error_at_hidden_layer= d_output.dot(wout.T)

47 d_hiddenlayer= Error_at_hidden_layer* slope_hidden_layer

48 wout+= hiddenlayer_activations.T.dot(d_output)*lr

49 bout+= np.sum(d_output, axis=0,keepdims=True)*lr

50 wh+= X.T.dot(d_hiddenlayer)*lr

51 bh+= np.sum(d_hiddenlayer, axis=0,keepdims=True)*lr

52

53print('actual :\n', y,'\n')

54print('predicted :\n', output)

使用PyTorch如下(下面的代码中用粗体表示差异):

## neural network in pytorch

import torch

#Input array

X = torch.Tensor([[1,0,1,0],[1,0,1,1],[0,1,0,1]])

#Output

y = torch.Tensor([[1],[1],[0]])

#Sigmoid Function

def sigmoid (x):

return 1/(1 + torch.exp(-x))

#Derivative of Sigmoid Function

def derivatives_sigmoid(x):

return x * (1 - x)

#Variable initialization

epoch=5000 #Setting training iterations

lr=0.1 #Setting learning rate

inputlayer_neurons = X.shape[1] #number of features in data set

hiddenlayer_neurons = 3 #number of hidden layers neurons

output_neurons = 1 #number of neurons at output layer

#weight and bias initialization

wh=torch.randn(inputlayer_neurons, hiddenlayer_neurons).type(torch.FloatTensor)

bh=torch.randn(1, hiddenlayer_neurons).type(torch.FloatTensor)

wout=torch.randn(hiddenlayer_neurons, output_neurons)

bout=torch.randn(1, output_neurons)

for i in range(epoch):

#Forward Propogation

hidden_layer_input1 = torch.mm(X, wh)

hidden_layer_input = hidden_layer_input1 + bh

hidden_layer_activations = sigmoid(hidden_layer_input)

output_layer_input1 = torch.mm(hidden_layer_activations, wout)

output_layer_input = output_layer_input1 + bout

output = sigmoid(output_layer_input1)

#Backpropagation

E = y-output

slope_output_layer = derivatives_sigmoid(output)

slope_hidden_layer = derivatives_sigmoid(hidden_layer_activations)

d_output = E * slope_output_layer

Error_at_hidden_layer = torch.mm(d_output, wout.t())

d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer

wout += torch.mm(hidden_layer_activations.t(), d_output) *lr

bout += d_output.sum() *lr

wh += torch.mm(X.t(), d_hiddenlayer) *lr

bh += d_output.sum() *lr

print('actual :\n', y, '\n')

print('predicted :\n', output)

与其他深度学习库比较

在一个基准脚本中,PyTorch 在训练LSTM方面表现优于所有其他主要的深度学习库,每个周期的中位时间最低(参见下图)。

在PyTorch中用于数据加载的API设计良好。接口在数据集,采样器和数据加载器中指定。

在比较TensorFlow中的数据加载工具(readers,queues,等)时,我发现PyTorch的数据加载模块非常好用。另外,PyTorch可以无缝的构建神经网络,我们不必依赖像keras这样的第三方高级库。

另一方面,我不会推荐使用PyTorch进行部署。PyTorch还在发展中。正如PyTorch开发人员所说:“我们看到的是,用户首先创建了一个PyTorch模型。当他们准备将他们的模型部署到生产环境中时,他们只需将其转换为Caffe 2模型,然后将其发布到移动平台或其他平台中。“

案例研究 – 解决PyTorch中的图像识别问题

为了熟悉PyTorch,我们将解决分析方面的深度学习实践问题 – 识别数字。

我们的要做的是一个图像识别问题,从一个给定的28×28像素的图像中识别数字。我们有一部分图像用于训练,其余部分用于测试我们的模型。

首先,下载训练集与测试集。数据集包含所有图像的压缩文件,并且train.csv和test.csv都具有相应训练和测试图像的名称。数据集中不提供任何额外特征,图片为.png格式。

第0步:准备工作

a)导入所有需要用到的库

1# import modules

2%pylab inline

3import os

4import numpy as np

5import pandas as pd

6from scipy.miscimport imread

7from sklearn.metricsimport accuracy_score

b)让我们设置seed值,以便我们可以控制模型的随机性

1# To stop potential randomness

2seed= 128

3rng= np.random.RandomState(seed)

c)第一步是设置目录路径,以便妥善保存!

1root_dir= os.path.abspath('.')

2data_dir= os.path.join(root_dir,'data')

3

4# check for existence

5os.path.exists(root_dir), os.path.exists(data_dir)

第1步:数据加载和预处理

a)现在让我们读取数据集。

1# load dataset

2train= pd.read_csv(os.path.join(data_dir,'Train','train.csv'))

3test= pd.read_csv(os.path.join(data_dir,'Test.csv'))

4

5sample_submission= pd.read_csv(os.path.join(data_dir,'Sample_Submission.csv'))

6

7train.head()

b)让我们看看我们的数据是什么样的。我们阅读我们的图像并显示它。

1# print an image

2img_name= rng.choice(train.filename)

3filepath= os.path.join(data_dir,'Train','Images','train', img_name)

4

5img= imread(filepath, flatten=True)

6

7pylab.imshow(img, cmap='gray')

8pylab.axis('off')

9pylab.show()

d)为了便于数据处理,让我们将所有图像存储为numpy数组

01# load images to create train and test set

02temp= []

03for img_namein train.filename:

04 image_path= os.path.join(data_dir,'Train','Images','train', img_name)

05 img= imread(image_path, flatten=True)

06 img= img.astype('float32')

07 temp.append(img)

08

09train_x= np.stack(temp)

10

11train_x/= 255.0

12train_x= train_x.reshape(-1,784).astype('float32')

13

14temp= []

15for img_namein test.filename:

16 image_path= os.path.join(data_dir,'Train','Images','test', img_name)

17 img= imread(image_path, flatten=True)

18 img= img.astype('float32')

19 temp.append(img)

20

21test_x= np.stack(temp)

22

23test_x/= 255.0

24test_x= test_x.reshape(-1,784).astype('float32')

25

26train_y= train.label.values

e)这是一个典型的机器学习问题,为了测试我们模型的是否正常运行,我们创建一个验证集。我们分离他们的比例为70:30(验证集为30)。

1# create validation set

2split_size= int(train_x.shape[0]*0.7)

3

4train_x, val_x= train_x[:split_size], train_x[split_size:]

5train_y, val_y= train_y[:split_size], train_y[split_size:]

第2步:建立模型

a)下面,我们定义神经网络架构。我们定义了一个3个层(输入,隐藏和输出)的神经网络。输入和输出中神经元的数量是固定的,因为输入是我们图像28×28,并且输出是代表类的10×1向量(即每个像素对应一个输入神经元,每个类为一个输出)。我们在隐藏层中采用50个神经元。在这里,我们使用Adam作为我们的优化算法,它是梯度下降算法的一个不错的变种。

1import torch

2from torch.autogradimport Variable

1# number of neurons in each layer

2input_num_units= 28*28

3hidden_num_units= 500

4output_num_units= 10

5

6# set remaining variables

7epochs= 5

8batch_size= 128

9learning_rate= 0.001

b)训练模型

01# define model

02model= torch.nn.Sequential(

03 torch.nn.Linear(input_num_units, hidden_num_units),

04 torch.nn.ReLU(),

05 torch.nn.Linear(hidden_num_units, output_num_units),

06)

07loss_fn= torch.nn.CrossEntropyLoss()

08

09# define optimization algorithm

10optimizer= torch.optim.Adam(model.parameters(), lr=learning_rate)

01## helper functions

02# preprocess a batch of dataset

03def preproc(unclean_batch_x):

04 """Convert values to range 0-1"""

05 temp_batch= unclean_batch_x/ unclean_batch_x.max()

06

07 return temp_batch

08

09# create a batch

10def batch_creator(batch_size):

11 dataset_name= 'train'

12 dataset_length= train_x.shape[0]

13

14 batch_mask= rng.choice(dataset_length, batch_size)

15

16 batch_x= eval(dataset_name+ '_x')[batch_mask]

17 batch_x= preproc(batch_x)

18

19 if dataset_name== 'train':

20 batch_y= eval(dataset_name).ix[batch_mask,'label'].values

21

22 return batch_x, batch_y

01# train network

02total_batch= int(train.shape[0]/batch_size)

03

04for epochin range(epochs):

05 avg_cost= 0

06 for iin range(total_batch):

07 # create batch

08 batch_x, batch_y= batch_creator(batch_size)

09

10 # pass that batch for training

11 x, y= Variable(torch.from_numpy(batch_x)), Variable(torch.from_numpy(batch_y), requires_grad=False)

12 pred= model(x)

13

14 # get loss

15 loss= loss_fn(pred, y)

16

17 # perform backpropagation

18 loss.backward()

19 optimizer.step()

20 avg_cost+= loss.data[0]/total_batch

21

22 print(epoch, avg_cost)

1# get training accuracy

2x, y= Variable(torch.from_numpy(preproc(train_x))), Variable(torch.from_numpy(train_y), requires_grad=False)

3pred= model(x)

4

5final_pred= np.argmax(pred.data.numpy(), axis=1)

6

7accuracy_score(train_y, final_pred)

1# get validation accuracy

2x, y= Variable(torch.from_numpy(preproc(val_x))), Variable(torch.from_numpy(val_y), requires_grad=False)

3pred= model(x)

4final_pred= np.argmax(pred.data.numpy(), axis=1)

5

6accuracy_score(val_y, final_pred)

训练分数是:

10.8779008746355685

验证分数是:

10.867482993197279

这个分数相当的高,我们才训练这个简单的神经网络五个周期而已。

本文由atyun编译,转载请注明出处。更多内容关注微信公众号atyun_com;访问网站http://www.atyun.com;或加资源群:213252181

python pytorch库_一个简单而强大的深度学习库—PyTorch相关推荐

  1. 让AI简单且强大:深度学习引擎OneFlow技术实践

    https://www.toutiao.com/a6683330972982706702/ 本文内容节选自由msup主办的第七届TOP100summit,北京一流科技有限公司首席科学家袁进辉(老师木) ...

  2. python自动控制库_一个可以自动化控制鼠标键盘的库:PyAUtoGUI

    PyAutoGUI 不知道你们有没有用过,它是一款用Python自动化控制键盘.鼠标的库.但凡是你不想手动重复操作的工作都可以用这个库来解决. 如果,我想半夜时候定时给发个微信,或者每天自动刷页面等操 ...

  3. python 波形包络线_一个简单的波形包络提取算法

    最近做了一个项目来提取语音信号包络波形,因此,花一些时间来研究各种包络提取算法. 所谓包络检测被称为振幅解调,在许多领域都有重要的应用.它假设载波信号被确定,所以,通常的方式同步解调,优选以这样的方式 ...

  4. DL:深度学习框架Pytorch、 Tensorflow各种角度对比

    DL:深度学习框架Pytorch. Tensorflow各种角度对比 目录 先看两个框架实现同样功能的代码 1.Pytorch.Tensorflow代码比较 2.Tensorflow(数据即是代码,代 ...

  5. tflearn教程_利用 TFLearn 快速搭建经典深度学习模型

    使用 TensorFlow 一个最大的好处是可以用各种运算符(Ops)灵活构建计算图,同时可以支持自定义运算符(见本公众号早期文章<TensorFlow 增加自定义运算符>).由于运算符的 ...

  6. src获取同级目录中的图片_一个简单的Python爬虫实例:百度贴吧页面下载图片

    本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片. 1. 概述 本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片.下载图片的步骤如下: 获取网页html文本内容: 分析html ...

  7. Life——一个简洁易用的强化学习库,基于pytorch

    简介 Life是一个基于pytorch实现的强化学习库,实现了多种强化学习算法. 项目地址:https://github.com/HanggeAi/Life 目前包含的强化学习算法 Sarsa mul ...

  8. 极力推荐一个简单好用的C++JSON库

      极力推荐一个简单好用的C++JSON库CJsonObject,让使用json如使用C++原生的结构体那般方便,随心所欲.CJsonObject是个优秀的C++JSON库,也许会是你见过的最为简单易 ...

  9. python程序30行_30行Python代码,打造一个简单的微信群聊助手,简单方便

    大家都知道,最近代码君迷上了Python,一直在研究这门语言,还是那句话,人生苦短,我学Python,今天代码君要教大家一个黑科技,30行代码实现自己定制的微信群聊助手,这个助手有什么用呐,就是用来活 ...

  10. Python机器学习、深度学习库总结(内含大量示例,建议收藏)

    Python机器学习.深度学习库总结(内含大量示例,建议收藏) 前言 python常用机器学习及深度学习库介绍 总结与分类 python 常用机器学习及深度学习库总结 分类 更多 前言 目前,随着人工 ...

最新文章

  1. C/C++、嵌入式秋招之SQL篇
  2. 微服务架构下静态数据通用缓存机制
  3. GoogleSketchUp构建家庭模型
  4. CNN卷积神经网络的三种基本模式(不懂的话还得多努力啊!)
  5. 10周带你手推机器学习算法公式,30+视频为你讲解Sklearn库应用
  6. mysql数据表中取几列_MySQL查询数据表中数据记录(包括多表查询)
  7. java反射 set_Java反射
  8. HttpClient 设置不当引发的一次雪崩
  9. F - Restoring the Expression CodeForces - 898F
  10. 高等数学-空间解析几何与向量代数
  11. 网站备案 应该找域名商还是空间商备案
  12. 产品经理常用的方法论有哪些
  13. Python与图像处理7
  14. R安装WGCNA包(MacOS M1芯片)及impute包安装报错的解决方法【已成功】
  15. 说说打印样式CSS的技巧和要点
  16. 个人中心html更换头像,html5 头像上传更换插件
  17. [自动驾驶系列一]Introduction to Self-Driving Cars
  18. 常用的python标准库有哪些?
  19. python智慧树判断题_智慧树知到_大数据分析的python基础_判断题答案
  20. JAVA云音乐后端内容管理系统计算机毕业设计Mybatis+系统+数据库+调试部署

热门文章

  1. ​新手到底如何入门PLC?
  2. 商用密码应用安全性评估
  3. Java 线程的创建——8种方法
  4. 目标检测:YOLOV2
  5. 极化码生成矩阵的构造
  6. matlab作函数图像,matlab绘制函数图像
  7. python开三次方_python 三次方
  8. matlab将函数展开成幂级数,解析函数展开成幂级数的方法分析.doc
  9. H3C Comware的作用
  10. socket php建立聊天室,PHP搭建socket聊天室