热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从学习Paddle开始学习深度学习

北京|高性能计算之GPUCUDA课程11月24-26日3天密集学习快速带你晋级阅读全文>作者系华中科技大学,电子信息工程;方向:深度学习、并行计
北京 | 高性能计算之GPU CUDA课程11月24-26日 3天密集学习 快速带你晋级 阅读全文 >


作者系华中科技大学,电子信息工程;方向:深度学习、并行计算、数据挖掘。


首先给Baidu打一波广告。Paddle深度学习平台,你值得学习。


优点

灵活性:PaddlePaddle支持广泛的神经网络结构和优化算法,很容易配置复杂的模型,如基于注意力(Attention)机制或复杂的内存(Memory)连接的神经机器翻译模型。(Attention和Memory参考阅读: 深度学习和自然语言处理中的attention和memory机制 、 深度学习:推动NLP领域发展的新引擎 )


高效:在PaddlePaddle的不同层面进行优化,以发挥异构计算资源的效率,包括计算、内存、架构和通信等。例如:


通过SSE/AVX内部函数,BLAS库(例如MKL,ATLAS,CUBLAS)或定制CPU/GPU内核优化的数学运算。


高度优化循环网络,以处理可变长度序列,无需填充(Padding)。


优化高维稀疏数据模型的本地和分布式训练。


可扩展性:PaddlePaddle很容易使用多个CPU/GPU和机器来加快你的训练,通过优化通信实现高吞吐量、高性能。


连接产品:PaddlePaddle易于部署。在百度,PaddlePaddle已经被部署到广大用户使用的产品或服务,包括广告点击率(CTR)的预测,大型图像分类,光学字符识别(OCR),搜索排名,计算机病毒检测,推荐等。


先做一个形象的比喻,Paddle就好比一台3D打印机,我们设计的神经网络就好比需要打印的模型,而我们的数据集就相当于原材料,把两者同时提供给这台打印机,经过一段时间就可以得到我们预期的产品--模型(Trained Model).


简言之,paddle 做的工作就是利用我们设计的模型和我们提供的数据 通过高性能的并行技术(CPU/GPU)来完成训练。


所以,我们在使用 Paddle 做深度学习时最基本的工作就是设计一个完美的模型并准备好数据。也就是要有以下几个文件:



trainer_config.py : 配置神经网络模型

data_provider.py : 数据提供

train.sh : 配置paddle训练的参数


安装


paddle提供了三种安装方式:


  • Docker 安装,非常便捷,但必须在Docker环境下部署。

  • deb 安装, 在Ubuntu下打包安装。

  • 编译安装 文档上写的有点复杂,其实很简单,先处理完一些依赖库,比如 MKL/BLAS、protobuf 以及CUDA之类的(非GPU用户不用担心)。然后就是最基本的操作 make 之类了。每个用户都可以去尝试一下,可拓展性和可操作性都很强。

简单使用


 数据


可以分为如下两步:

  • 定义数据格式

  • 通过生成器和yield方式提供数据


以手写字MNIST作为例子


数据样例:


5;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.215686 0.533333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.67451 0.992157 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.070588 0.886275 0.992157 0 0 0 0 0 0 0 0 0 0 0.192157 0.070588 0 0 0 0 0 0 0 0 0 0 0 0 0 0.670588 0.992157 0.992157 0 0 0 0 0 0 0 0 0 0.117647 0.933333 0.858824 0.313725 0 0 0 0 0 0 0 0 0 0 0 0.090196 0.858824 0.992157 0.831373 0 0 0 0 0 0 0 0 0 0.141176 0.992157 0.992157 0.611765 0.054902 0 0 0 0 0 0 0 0 0 0 0.258824 0.992157 0.992157 0.529412 0 0 0 0 0 0 0 0 0 0.368627 0.992157 0.992157 0.419608 0.003922 0 0 0 0 0 0 0 0 0 0.094118 0.835294 0.992157 0.992157 0.517647 0 0 0 0 0 0 0 0 0 0.603922 0.992157 0.992157 0.992157 0.603922 0.545098 0.043137 0 0 0 0 0 0 0 0.447059 0.992157 0.992157 0.956863 0.062745 0 0 0 0 0 0 0 0 0.011765 0.666667 0.992157 0.992157 0.992157 0.992157 0.992157 0.745098 0.137255 0 0 0 0 0 0.152941 0.866667 0.992157 0.992157 0.521569 0 0 0 0 0 0 0 0 0 0.070588 0.992157 0.992157 0.992157 0.803922 0.352941 0.745098 0.992157 0.945098 0.317647 0 0 0 0 0.580392 0.992157 0.992157 0.764706 0.043137 0 0 0 0 0 0 0 0 0 0.070588 0.992157 0.992157 0.776471 0.043137 0 0.007843 0.27451 0.882353 0.941176 0.176471 0 0 0.180392 0.898039 0.992157 0.992157 0.313725 0 0 0 0 0 0 0 0 0 0 0.070588 0.992157 0.992157 0.713725 0 0 0 0 0.627451 0.992157 0.729412 0.062745 0 0.509804 0.992157 0.992157 0.776471 0.035294 0 0 0 0 0 0 0 0 0 0 0.494118 0.992157 0.992157 0.968627 0.168627 0 0 0 0.423529 0.992157 0.992157 0.364706 0 0.717647 0.992157 0.992157 0.317647 0 0 0 0 0 0 0 0 0 0 0 0.533333 0.992157 0.984314 0.945098 0.603922 0 0 0 0.003922 0.466667 0.992157 0.988235 0.976471 0.992157 0.992157 0.788235 0.007843 0 0 0 0 0 0 0 0 0 0 0 0.686275 0.882353 0.364706 0 0 0 0 0 0 0.098039 0.588235 0.992157 0.992157 0.992157 0.980392 0.305882 0 0 0 0 0 0 0 0 0 0 0 0 0.101961 0.67451 0.321569 0 0 0 0 0 0 0 0.105882 0.733333 0.976471 0.811765 0.713725 0 0 0 0 0 0 0 0 0 0 0 0 0 0.65098 0.992157 0.321569 0 0 0 0 0 0 0 0 0 0.25098 0.007843 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0.94902 0.219608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.968627 0.764706 0.152941 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.498039 0.25098 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;


数据可拆分为 label 和 784 的一个浮点数一维向量。


定义数据格式


在 data_provider.py中,有两种方式定义输入数据格式。


1、通过装饰器直接定义


@provider(input_types=[dense_vector(784), integer_value(10)],cache=CacheType.CACHE_PASS_IN_MEM)


定义了一个稠密的784维向量和一个范围从0~10的整数。


或者可以有如下定义


@provider(input_types={    'pixel': dense_vector(784),        'label': integer_value(10)    },cache=CacheType.CACHE_PASS_IN_MEM)


这样通过字典定义,可以方便标记和访问。


2、通过init_hook间接定义


def initialize(settings, **kwargs):    s = dict()    s['data'] = dense_vector(784)    s['label'] = integer_value(10)    settings.input_types = s @provider(init_hook=initialize,cache=CacheType.CACHE_PASS_IN_MEM)


通过init_hook方式更加灵活,可以动态修改输入的数据类型。另外,在init_hook方法中可以提前对settings进行配置或者动态添加一些参数,供后续工作使用。


关于两种方式的选择依据个人需求。


通过生成器和yield提供数据


yield方用法 具体查看Python文档。


定义好数据格式后,就可以开始结合那个@provider装饰器提供数据了。


@provider(input_types=[dense_vector(784), integer_value(10)],cache=CacheType.CACHE_PASS_IN_MEM) def process(settings, filename):    with open(filename, 'r') as f:        for line in f:            label, pixel = line.split(';')            pixels_str = pixel.split(' ')            pixels_float = []            for each_pixel_str in pixels_str:                pixels_float.append(float(each_pixel_str))            yield {"pixel": pixels_float, 'label': int(label)}


下面来介绍一下这个函数的一些内容:


  • settings:这是一个全局的配置。里面可以访问一些变量,尤其是我们在init_hook中动态添加的属性。

  • filename:显然,我们获取数据需要文件。这个file就是我们需要准备的训练集和测试文件。然而我们并不会主动去调用函数,一切调用交给了Paddle。那么我们怎么把数据提交给Paddle,Paddle又如何把数据以filename的方式交给上述的data_provider中的process 处理呢?


下面要引入另外几个特殊的文件


  • train.list 一个简单的文本文件,将训练文件的目录写进去,比如 data/mnist.txt

  • test.list 存放测试文件,内容同上。


这些文件处理好后,直接交给paddle,然后我们就可以在data_provider中对我们写进这两个文件里的训练文件和测试文件(data/mnist.txt) 进行读取操作了。



如上图:整个数据提供的顺序为:


1、将test.list 和 train.list 提供给 Paddle;


2、Paddle 将test.list 和 test.list中的数据文件(如MNIST.txt) 传给 data_provider.py;


3、data_provider.py将数据分离成对应的input_types传递给Paddle;


4、Paddle 将 数据向量 和 trainer_config.py中的模型结合起来训练并测试模型。


补充

input_types:


dense_vector 表示稠密的浮点数向量.


sparse_binary_vector 表示稀疏的零一向量,即大部分值为0,有值的位置只能取1.


sparse_vector 表示稀疏的向量,即大部分值为0,有值的部分可以是任何浮点数.


integer_value 表示整数标签。


cache


NO_CACHE :不缓存任何数据,每次都会从python端读取数据.


CACHE_PASS_IN_MEM :第一个pass会从python端读取数据,剩下的pass会直接从内存里 读取数据。


2、模型配置


还是以手写字为例。


在 trainer_config.py 中 开始配置模型, 模型配置分三部分。


  • 数据提供

  • 算法配置

  • 网络配置


首先


from paddle.trainer_config_helpers import *


数据提供


define_py_data_sources2(    
train_list='train.list',    
test_list='test.list',    
module='data_provider',    
obj=process,    
args={      
 //  

 }

)


这个函数可以向paddle配置数据输入。


  • module: Data Provider 的脚本文件名如data_provider对应 data_provider.py

  • obj:对应数据提供函数(含有yield)

  • args:为可选项,可以提供一些键值数据给init_hook函数作为函数调用的自定义参数。

算法配置


settings(    
batch_size=batch_size,    
learning_rate=0.001,    
learning_method=RMSPropOptimizer(),    
regularization=L2Regularization(8e-4)

)


这个用于配置深度神经网路的一些参数, 比如学习率,batch_size,以及正则化方法和学习方法。后面会对这些参数做详细的分析。


网络配置
  • 输入数据获取

data = data_layer(name='data', size=784) label = data_layer(name='label', size=10)


  • 神经网络配置


最基本网络模型 -- Fully Connected Layer 全连接层


# 第一个全连接隐层 有 64 个神经元 激活函数为 Sigmoid 函数 full_layer = fc_layer(input=data, size=64, act=SigmoidActivation()) # 第二个全连接隐层 有 32 个神经元 激活函数为 ReLU 函数 full_2_layer = fc_layer(input=full_layer, size=32, act=ReluActivation()) # 输出层 有10个神经元, 激活函数为Softmax output_layer = fc_layer(input=full_2_layer, size=10, act=SoftmaxActivation()) # 计算分类损失,并执行误差反向传播 cost = classfication_cost(input=output_layer, label=label) # 输出 output(cost)


output 一般作为模型配置的结束点,没有output会导致paddle报异常的错误。


神经网络Layer还有很多种类,如 LSTM,CNN,RNN以及各种pool。会在以后的介绍中提到。


3、训练
run shell scripts


cfg=trainer_config.py  
paddle train \  
--cOnfig=$cfg \ # 模型配置  
 --save_dir=$output_dir \ # 输出文件存储目录  
 --trainer_count=64 \ # GPU个数或者CPU个数  
--log_period=1000 \ #  
--dot_period=100 \ # 每一个period的输出dot的数量  
--num_passes=50 \ # 训练轮数  
--use_gpu=false \ # 是否使用GPU  
--show_parameter_stats_pe
riod=3000 \


run后paddle就会开始训练,深度学习的大门就开启了。


总结


Paddle 刚开源不久,确实存在一些问题,Baidu开发者也在不断更新完善(回复issue的速度贼快)。但熟悉后会觉得这个框架可用性很强。支持国产!


原文链接:http://www.jianshu.com/p/699692fdd446


查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org


请关注人工智能LeadAI公众号,查看更多专业文章


大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础


点击“阅读原文”直接打开【北京站 | GPU CUDA 进阶课程】报名链接


推荐阅读
  • 时序数据是指按时间顺序排列的数据集。通过时间轴上的数据点连接,可以构建多维度报表,揭示数据的趋势、规律及异常情况。 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 尤洋:夸父AI系统——大规模并行训练的深度学习解决方案
    自从AlexNet等模型在计算机视觉领域取得突破以来,深度学习技术迅速发展。近年来,随着BERT等大型模型的广泛应用,AI模型的规模持续扩大,对硬件提出了更高的要求。本文介绍了新加坡国立大学尤洋教授团队开发的夸父AI系统,旨在解决大规模模型训练中的并行计算挑战。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本文详细探讨了 Android Service 组件中 onStartCommand 方法的四种不同返回值及其应用场景。Service 可以在后台执行长时间的操作,无需提供用户界面,支持通过启动和绑定两种方式创建。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了&#x ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • 本文旨在介绍一系列提升工作效率的浏览器插件和实用小工具,帮助用户在日常工作中更加便捷高效。内容由原作者授权发布。 ... [详细]
  • Topaz Video Enhance AI V2.2.0 - 高级AI视频画质提升工具 | 下载及使用指南
    Topaz Video Enhance AI 是一款利用先进的人工智能技术设计的视频画质增强软件,特别适用于视频剪辑,旨在通过深度学习技术提升视频质量,减少噪点和恢复细节。 ... [详细]
  • 本文介绍了基于Java的在线办公工作流系统的毕业设计方案,涵盖了MyBatis框架的应用、源代码分析、调试与部署流程、数据库设计以及相关论文撰写指导。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 深入理解云计算与大数据技术
    本文详细探讨了云计算与大数据技术的关键知识点,包括大数据处理平台、社会网络大数据、城市大数据、工业大数据、教育大数据、数据开放与共享的应用,以及搜索引擎与Web挖掘、推荐技术的研究及应用。文章还涵盖了云计算的基础概念、特点和服务类型分类。 ... [详细]
author-avatar
mobiledu2502879833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有