paddlepaddle初步印象
从其官网整理了一些资料如下:
1、基本概念
基本使用概念
PaddlePaddle是源于百度的一个深度学习平台。PaddlePaddle为深度学习研究人员提供了丰富的API,可以轻松地完成神经网络配置,模型训练等任务。 这里将介绍PaddlePaddle的基本使用概念,并且展示了如何利用PaddlePaddle来解决一个经典的线性回归问题。
2、安装
PaddlePaddle的编译选项
PaddlePaddle的编译选项,包括生成CPU/GPU二进制文件、链接何种BLAS库等。用户可在调用cmake的时候设置它们,详细的cmake使用方法可以参考 官方文档 。
Bool型的编译选项
用户可在cmake的命令行中,通过使用 -D
命令设置该类编译选项,例如
cmake .. -DWITH_GPU=OFF
选项 | 说明 | 默认值 |
WITH_GPU | 是否支持GPU。 | 取决于是否寻找到CUDA工具链 |
WITH_DOUBLE | 是否使用双精度浮点数。 | 否 |
WITH_DSO | 是否运行时动态加载CUDA动态库,而非静态加载CUDA动态库。 | 是 |
WITH_AVX | 是否编译含有AVX指令集的PaddlePaddle二进制文件 | 是 |
WITH_PYTHON | 是否内嵌PYTHON解释器。方便今后的嵌入式移植工作。 | 是 |
WITH_STYLE_CHECK | 是否编译时进行代码风格检查 | 是 |
WITH_RDMA | 是否开启RDMA | 否 |
WITH_TIMER | 是否开启计时功能。如果开启会导致运行略慢,打印的日志变多,但是方便调试和测Benchmark | 否 |
WITH_TESTING | 是否开启单元测试 | 取决于是否寻找到GTEST |
WITH_DOC | 是否编译中英文文档 | 否 |
WITH_SWIG_PY | 是否编译PYTHON的SWIG接口,该接口可用于预测和定制化训练 | 取决于是否寻找到SWIG |
BLAS/CUDA/Cudnn的编译选项
BLAS
PaddlePaddle支持以下任意一种BLAS库:MKL ,ATLAS ,OpenBlAS 和 REFERENCE BLAS 。
编译选项 | 描述 | 注意 |
MKL_ROOT | MKL的路径 | ${MKL_ROOT}/include下需要包含mkl.h,${MKL_ROOT}/lib目录下需要包含mkl_core,mkl_sequential和mkl_intel_lp64三个库。 |
ATLAS_ROOT | ATLAS的路径 | ${ATLAS_ROOT}/include下需要包含cblas.h,${ATLAS_ROOT}/lib下需要包含cblas和atlas两个库。 |
OPENBLAS_ROOT | OpenBLAS的路径 | ${OPENBLAS_ROOT}/include下需要包含cblas.h,${OPENBLAS_ROOT}/lib下需要包含openblas库。 |
REFERENCE_CBLAS_ROOT | REFERENCE BLAS的路径 | ${REFERENCE_CBLAS_ROOT}/include下需要包含cblas.h,${REFERENCE_CBLAS_ROOT}/lib下需要包含cblas库。 |
CUDA/Cudnn
PaddlePaddle可以使用cudnn v2之后的任何一个版本来编译运行,但尽量请保持编译和运行使用的cudnn是同一个版本。 我们推荐使用最新版本的cudnn v5.1。
编译选项的设置
PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/Cudnn库。cmake编译时,首先在系统路径(/usr/lib:/usr/local/lib)中搜索这几个库,同时也会读取相关路径变量来进行搜索。 通过使用 -D
命令可以设置,例如
cmake .. -DMKL_ROOT=/opt/mkl/ -DCUDNN_ROOT=/opt/cudnnv5
注意:这几个编译选项的设置,只在第一次cmake的时候有效。如果之后想要重新设置,推荐清理整个编译目录(rm -rf
)后,再指定。
3、一个简单的神经网络
加载PaddlePaddle
在进行网络配置之前,首先需要加载相应的Python库,并进行初始化操作。
import paddle.v2 as paddle import numpy as np paddle.init(use_gpu=False)
搭建神经网络
搭建神经网络就像使用积木搭建宝塔一样。在PaddlePaddle中,layer是我们的积木,而神经网络是我们要搭建的宝塔。我们使用不同的layer进行组合,来搭建神经网络。 宝塔的底端需要坚实的基座来支撑,同样,神经网络也需要一些特定的layer作为输入接口,来完成网络的训练。
例如,我们可以定义如下layer来描述神经网络的输入:
x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector(2)) y = paddle.layer.data(name='y', type=paddle.data_type.dense_vector(1))
其中x表示输入数据是一个维度为2的稠密向量,y表示输入数据是一个维度为1的稠密向量。
PaddlePaddle支持不同类型的输入数据,主要包括四种类型,和三种序列模式。
四种数据类型:
- dense_vector:稠密的浮点数向量。
- sparse_binary_vector:稀疏的01向量,即大部分值为0,但有值的地方必须为1。
- sparse_float_vector:稀疏的向量,即大部分值为0,但有值的部分可以是任何浮点数。
- integer:整数标签。
三种序列模式:
- SequenceType.NO_SEQUENCE:不是一条序列
- SequenceType.SEQUENCE:是一条时间序列
- SequenceType.SUB_SEQUENCE: 是一条时间序列,且序列的每一个元素还是一个时间序列。
不同的数据类型和序列模式返回的格式不同,列表如下:
NO_SEQUENCE | SEQUENCE | SUB_SEQUENCE | |
---|---|---|---|
dense_vector | [f, f, ...] | [[f, ...], [f, ...], ...] | [[[f, ...], ...], [[f, ...], ...],...] |
sparse_binary_vector | [i, i, ...] | [[i, ...], [i, ...], ...] | [[[i, ...], ...], [[i, ...], ...],...] |
sparse_float_vector | [(i,f), (i,f), ...] | [[(i,f), ...], [(i,f), ...], ...] | [[[(i,f), ...], ...], [[(i,f), ...], ...],...] |
integer_value | i | [i, i, ...] | [[i, ...], [i, ...], ...] |
其中,f代表一个浮点数,i代表一个整数。
注意:对sparse_binary_vector和sparse_float_vector,PaddlePaddle存的是有值位置的索引。例如,
- 对一个5维非序列的稀疏01向量
[0, 1, 1, 0, 0]
,类型是sparse_binary_vector,返回的是[1, 2]
。 - 对一个5维非序列的稀疏浮点向量
[0, 0.5, 0.7, 0, 0]
,类型是sparse_float_vector,返回的是[(1, 0.5), (2, 0.7)]
。
在定义输入layer之后,我们可以使用其他layer进行组合。在组合时,需要指定layer的输入来源。
例如,我们可以定义如下的layer组合:
y_predict = paddle.layer.fc(input=x, size=1, act=paddle.activation.Linear()) cost = paddle.layer.mse_cost(input=y_predict, label=y)
其中,x与y为之前描述的输入层;而y_predict是接收x作为输入,接上一个全连接层;cost接收y_predict与y作为输入,接上均方误差层。
最后一层cost中记录了神经网络的所有拓扑结构,通过组合不同的layer,我们即可完成神经网络的搭建。
训练模型
在完成神经网络的搭建之后,我们首先需要根据神经网络结构来创建所需要优化的parameters,并创建optimizer。 之后,我们可以创建trainer来对网络进行训练。
parameters = paddle.parameters.create(cost) optimizer = paddle.optimizer.Momentum(momentum=0) trainer = paddle.trainer.SGD(cost=cost, parameters=parameters, update_equation=optimizer)
其中,trainer接收三个参数,包括神经网络拓扑结构、神经网络参数以及迭代方程。
在搭建神经网络的过程中,我们仅仅对神经网络的输入进行了描述。而trainer需要读取训练数据进行训练,PaddlePaddle中通过reader来加载数据。
# define training dataset reader def train_reader(): train_x = np.array([[1, 1], [1, 2], [3, 4], [5, 2]]) train_y = np.array([-2, -3, -7, -7]) def reader(): for i in xrange(train_y.shape[0]): yield train_x[i], train_y[i] return reader
最终我们可以调用trainer的train方法启动训练:
# define feeding map feeding = {'x': 0, 'y': 1} # event_handler to print training info def event_handler(event): if isinstance(event, paddle.event.EndIteration): if event.batch_id % 1 == 0: print "Pass %d, Batch %d, Cost %f" % ( event.pass_id, event.batch_id, event.cost) # training trainer.train( reader=paddle.batch(train_reader(), batch_size=1), feeding=feeding, event_handler=event_handler, num_passes=100)
关于PaddlePaddle的更多使用方法请参考 进阶指南。
线性回归完整示例
下面给出在三维空间中使用线性回归拟合一条直线的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
import paddle.v2 as paddle import numpy as np # init paddle paddle.init(use_gpu=False) # network config x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector(2)) y_predict = paddle.layer.fc(input=x, size=1, act=paddle.activation.Linear()) y = paddle.layer.data(name='y', type=paddle.data_type.dense_vector(1)) cost = paddle.layer.mse_cost(input=y_predict, label=y) # create parameters parameters = paddle.parameters.create(cost) # create optimizer optimizer = paddle.optimizer.Momentum(momentum=0) # create trainer trainer = paddle.trainer.SGD(cost=cost, parameters=parameters, update_equation=optimizer) # event_handler to print training info def event_handler(event): if isinstance(event, paddle.event.EndIteration): if event.batch_id % 1 == 0: print "Pass %d, Batch %d, Cost %f" % (event.pass_id, event.batch_id, event.cost) # define training dataset reader def train_reader(): train_x = np.array([[1, 1], [1, 2], [3, 4], [5, 2]]) train_y = np.array([-2, -3, -7, -7]) def reader(): for i in xrange(train_y.shape[0]): yield train_x[i], train_y[i] return reader # define feeding map feeding = {'x': 0, 'y': 1} # training trainer.train( reader=paddle.batch( train_reader(), batch_size=1), feeding=feeding, event_handler=event_handler, num_passes=100) |
paddlepaddle初步印象的更多相关文章
- 转来的——python webdriver自动化测试初步印象——转来的
python webdriver自动化测试初步印象 以下示例演示启动firefox,浏览google.com,搜索Cheese,等待搜索结果,然后打印出搜索结果页的标题 from selenium i ...
- HBASE学习笔记-初步印象
HBASE概念: HBASE是一个分布式架构的数据库,通过对数据进行多层的分块打散储存.从而改写传统数据库的储存能力和读取速度. HBASE的集群服务器: HBASE的集群主要分为Zookeeper集 ...
- linux服务器初步印象,远程连接mysql数据库,传输文件,启动/关闭tomcat命令
1.连接服务器数据库,以Navicat连接mysql为例 1.1 常规 新建连接,连接名,主机名或ip地址:127.0.0.1 端口:3306用户名:(服务器端)root密码:(服务器端)pwd 1. ...
- Carrot2 in action 初步印象
RawCluster:聚类中的类别单位 RawCluster.getDocuments():获得该类的文档列表 RawDocument:每个类的文档单位 STC:后缀树表示法 2008-11-13 C ...
- CMake初步(1)
转自:<你所不知的OSG>第一章:CMake初步(1)http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1189&f ...
- PostgreSQL执行机制的初步学习
作为开源数据库的新手,近日有兴对比了Pg和MySQL的查询计划. 通过Pg源码目录下的src\backend\executor\README文件,加上一些简单调试,就能对Pg的执行机制产生一个初步印象 ...
- [摘录]第三部分 IBM文化(1)
第二十章 论公司文化如果是在20世纪90年代初期,当一个人看见或者听到“IBM”时,他会联想到什么呢?或许是“大计算机”.“个人电脑”或者“ThinkPads”.但是,他们同时也必然会想到“大公司”. ...
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
- ASP.NET MVC 5 Web编程1 -- 入门
开篇引言 说起ASP.NET MVC,我想作为WebForms开发者第一点要问的是:为什么要使用它?我的理解是:MVC是更细节化的框架,“细节可控”意味着你的系统更精致.具体体现在应用上.MVC的出现 ...
随机推荐
- JAVA-JVM垃圾回收算法
哪些对象可以回收,有两种算法: 1. 引用计数算法,对象被引用计数器加1,对象被释放计数器减1.计数器为0的对象是可以被回收的. 此种方法优点:简单.缺点:会存在互相引用的两个对象,但实际这两个对象都 ...
- 解决Android Studio中Rendering Problems错误
android studio提示错误信息如下图: 解决办法: 打开styles.xml文件 在Theme.AppCompat.Light.DarkActionBar前面加上Base. 修改后解决错误:
- This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 解决办法
背景:mysql5.1.36,mybatis 前言:为了解决一对多,分页显示,但是前端主要是显示的一的一方的数据和(多方的某个字段拼接在一起),此时的limit不能直接跟在查询的后面,需要用子查询把需 ...
- 跟着我一起学习大数据——Hadoop
hadoop配置文件:http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.9.0/ 一:Hadoop简介 总结下起源于Nutch项目,社区 ...
- Extjs前端框架解决了什么问题
Extjs 作为一套企业级富客户端前端开发框架,主要解决了以下问题: 1.DOM Ext.Element: Ext.Element.get()快捷方式Ext.get(),只能以dom的id作为参数去获 ...
- Maven 一段时间知识小结
二种打包命令生成后的jar包比较 1.clean install -P dev 2.clean package -Dmaven.test.skip=true -P dev //clean packa ...
- spring boot 之Rabbitmq 基本配置
/* * Copyright (c) 2017 4PX Information Technology Co.,Ltd. All rights reserved. */package com.fpx.p ...
- Dive into Spring framework -- 了解基本原理(二)--设计模式-part2
Template模式 Template模式顾名思义是提供了一种模板,也就是针对某种业务提供了模范框架.这个在spring中是属于核心模式的,因为其ApplicationContext抽象类就是模板模式 ...
- ADC第一次读取
在ADCCON中,最后0位和1位互斥.如果1位选1的话,0位的值无效.如果1位选0的话,0位的值才有效.当1位选1的话:这是应用层的程序 #if ADSTART==0void niuniu(void) ...
- spring mvc: 多动作控制器(Controller下面实现多个访问的方法)MultiActionController / BeanNameUrlHandlerMapping
spring mvc: 多动作控制器(Controller下面实现多个访问的方法) 比如我的控制器是UserController.java,下面有home, add, remove等多个方法 访问地址 ...