python pytorch库_一个简单而强大的深度学习库—PyTorch
每过一段时间,总会有一个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相关推荐
- 让AI简单且强大:深度学习引擎OneFlow技术实践
https://www.toutiao.com/a6683330972982706702/ 本文内容节选自由msup主办的第七届TOP100summit,北京一流科技有限公司首席科学家袁进辉(老师木) ...
- python自动控制库_一个可以自动化控制鼠标键盘的库:PyAUtoGUI
PyAutoGUI 不知道你们有没有用过,它是一款用Python自动化控制键盘.鼠标的库.但凡是你不想手动重复操作的工作都可以用这个库来解决. 如果,我想半夜时候定时给发个微信,或者每天自动刷页面等操 ...
- python 波形包络线_一个简单的波形包络提取算法
最近做了一个项目来提取语音信号包络波形,因此,花一些时间来研究各种包络提取算法. 所谓包络检测被称为振幅解调,在许多领域都有重要的应用.它假设载波信号被确定,所以,通常的方式同步解调,优选以这样的方式 ...
- DL:深度学习框架Pytorch、 Tensorflow各种角度对比
DL:深度学习框架Pytorch. Tensorflow各种角度对比 目录 先看两个框架实现同样功能的代码 1.Pytorch.Tensorflow代码比较 2.Tensorflow(数据即是代码,代 ...
- tflearn教程_利用 TFLearn 快速搭建经典深度学习模型
使用 TensorFlow 一个最大的好处是可以用各种运算符(Ops)灵活构建计算图,同时可以支持自定义运算符(见本公众号早期文章<TensorFlow 增加自定义运算符>).由于运算符的 ...
- src获取同级目录中的图片_一个简单的Python爬虫实例:百度贴吧页面下载图片
本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片. 1. 概述 本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片.下载图片的步骤如下: 获取网页html文本内容: 分析html ...
- Life——一个简洁易用的强化学习库,基于pytorch
简介 Life是一个基于pytorch实现的强化学习库,实现了多种强化学习算法. 项目地址:https://github.com/HanggeAi/Life 目前包含的强化学习算法 Sarsa mul ...
- 极力推荐一个简单好用的C++JSON库
极力推荐一个简单好用的C++JSON库CJsonObject,让使用json如使用C++原生的结构体那般方便,随心所欲.CJsonObject是个优秀的C++JSON库,也许会是你见过的最为简单易 ...
- python程序30行_30行Python代码,打造一个简单的微信群聊助手,简单方便
大家都知道,最近代码君迷上了Python,一直在研究这门语言,还是那句话,人生苦短,我学Python,今天代码君要教大家一个黑科技,30行代码实现自己定制的微信群聊助手,这个助手有什么用呐,就是用来活 ...
- Python机器学习、深度学习库总结(内含大量示例,建议收藏)
Python机器学习.深度学习库总结(内含大量示例,建议收藏) 前言 python常用机器学习及深度学习库介绍 总结与分类 python 常用机器学习及深度学习库总结 分类 更多 前言 目前,随着人工 ...
最新文章
- C/C++、嵌入式秋招之SQL篇
- 微服务架构下静态数据通用缓存机制
- GoogleSketchUp构建家庭模型
- CNN卷积神经网络的三种基本模式(不懂的话还得多努力啊!)
- 10周带你手推机器学习算法公式,30+视频为你讲解Sklearn库应用
- mysql数据表中取几列_MySQL查询数据表中数据记录(包括多表查询)
- java反射 set_Java反射
- HttpClient 设置不当引发的一次雪崩
- F - Restoring the Expression CodeForces - 898F
- 高等数学-空间解析几何与向量代数
- 网站备案 应该找域名商还是空间商备案
- 产品经理常用的方法论有哪些
- Python与图像处理7
- R安装WGCNA包(MacOS M1芯片)及impute包安装报错的解决方法【已成功】
- 说说打印样式CSS的技巧和要点
- 个人中心html更换头像,html5 头像上传更换插件
- [自动驾驶系列一]Introduction to Self-Driving Cars
- 常用的python标准库有哪些?
- python智慧树判断题_智慧树知到_大数据分析的python基础_判断题答案
- JAVA云音乐后端内容管理系统计算机毕业设计Mybatis+系统+数据库+调试部署