最近除了工作以外,业余在参加Paddle的AI比赛,在用Paddle训练的过程中遇到了一些问题,并找到了解决方法,跟大家分享一下:


PaddlePaddle的Anaconda的兼容问题

  之前我是在服务器上安装的PaddlePaddle的gpu版本,我想把BROAD数据拷贝到服务器上面,结果发现我们服务器的22端口没开,不能用scp传上去,非常郁闷,只能在本地训练。本机mac的显卡是A卡,所以只能装cpu版本的,安装完以后,我发现运行一下程序的时候报错了:

 import paddle.v2 as paddle
 paddle.init(use_gpu=False,trainer_count=1)

  报错:

 Fatal Python error: PyThreadState_Get: no current thread
 Abort trap: 6

  

  这让我非常郁闷,因为之前我直接在服务器上装没有问题,但是我的数据不能传上去,所以只能在本机装一个,直接pip install paddlepaddle,初始化报错。后来我发现我本机装了anaconda,用anaconda的python运行paddle会有一些小问题,不过可以使用otool 和 install_name_tool对_swig_paddle.so进行修改就可以:

  1.运行otool,可以看到pip安装之后的_swig_paddle.so依赖/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/Python,但实际系统中不存在该路径

 otool -L /anaconda/lib/python2.7/site-packages/py_paddle/_swig_paddle.so
 /anaconda/lib/python2.7/site-packages/py_paddle/_swig_paddle.so:
 /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1445.12.0)
 /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 58286.20.16)
 /usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.0)
 /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)

  2.利用install_name_tool来替换依赖

 install_name_tool -change /usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/Python ~/anaconda/lib/libpython2.7.dylib ~/anaconda/lib/python2.7/site-packages/py_paddle/_swig_paddle.so

  3.替换成功后,可以看到第五条已经成功的换成anaconda下的路径了

 otool -L /anaconda/lib/python2.7/site-packages/py_paddle/_swig_paddle.so
 /anaconda/lib/python2.7/site-packages/py_paddle/_swig_paddle.so:
 /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1445.12.0)
 /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 58286.20.16)
 /anaconda/lib/libpython2.7.dylib (compatibility version 2.7.0, current version 2.7.0)
 /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)

  现在再运行paddle.init就不会有问题了

   不过要注意一点的是:在第二步中,anaconda的路径要写绝对路径。不能直接进去到anacona的上层目录后直接写/anaconda/lib...,如果这样做,那么你换一个路径再执行paddle.init还是会有问题,因为找不到你的anaconda的路径。


PaddlePaddle数据类型与数据读取

  我在这篇文章“【深度学习系列】PaddlePaddle之数据预处理”中写过PaddlePaddle的基本数据类型与如何用自己的数据集进行训练,但是还有很多同学给我发邮件问我这方面的问题,说在处理自己数据集的时候遇到了很多问题。下面我总结一下几个被问到的问题:

  1.不明白什么时候用sequence数据

  我们知道paddle有四种数据类型:dense_vector、sparse_binary_vector、sparse_float_vector和integer,但是还有三种序列格式,对于dense_vector的话,它的序列格式是dense_vector_sequence,但是什么时候用dense_vector_sequence呢?

  如果你的数据是x = [1.0,2.0,3.0,4.0]这样的,那么就应该用dense_vector,维度即为输入数据的维度(这里我们假设是4),那么应该设置为:

  x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector(4))

  如果你的数据是x = [ [1.0,2.0], [2.0,3.0], [3.0,4.0]],那么我们可以看到这个数据有三个时间步长,应该设置为:

  x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector_sequence(3))

  同理,interger_value和interger_value_sequence也是同样的处理方法,只不过向量里的元素由dense_vector中的float换成了int。

  2.不知道如何创建reader

  在数据预处理那篇文章中举了两个例子来说明如何创建自己的数据集,包括三种方式:reader、reader_creator和reader_decorator,针对于这个比赛,我们将数据解析后,转换成data和label的形式,那么我们应该如何创建reader呢?其实有很多种方式,写一个最简单的方式。我们来创建一个reader creator:

 def reader_creator(data,label):
     def reader():
         for i in xrange(len(data)):
             yield data[i,:],int(label[i])
     return reader

  在这里可以看到,使用了yield生成器来生成数据,分别生成同一个sample的data和label,返回的是一个reader函数,方便我们后面train的时候灌入数据。

  当然也有其他的方式可以创建,大家可以自行发挥。

  

  3.不知道怎么用创建好的reader训练

  大家可能会觉得很奇怪,为什么我们创建了reader creator后要返回一个reader函数呢,其实我们是为了方便在训练的时候调用,下面创建一个train_reader

train_reader = paddle.batch(paddle.reader.shuffle(
                reader_creator(data,label),buf_size=200),
                batch_size=16)

  我们上一步创建好的reader返回的数据放到paddle.reader.shuffle里进行数据混洗,就是把数据打散,buf_size表示我一次性把多少条数据放进来进行shuffle,可以自行设置,混洗好的数据放到paddle.batch里进行,以batch_size的量级批量灌倒模型里去训练,注意如果使用sgd的话,batch_size不能设置的太大,会崩溃,亲测 = =!

  同理,我们也可以创建val_reader,test_reader。

  创建完后,就可以放到trainer里训练了

trainer.train(reader=train_reader,num_passes=20,event_handler=event_handler)

  还有一些关于模型训练的参数设置技巧大家可以多尝试,如果有很多相同的问题话,我会再总结了发出来。

【深度学习系列】关于PaddlePaddle的一些避“坑”技巧的更多相关文章

  1. 【深度学习系列】PaddlePaddle垃圾邮件处理实战(二)

    PaddlePaddle垃圾邮件处理实战(二) 前文回顾   在上篇文章中我们讲了如何用支持向量机对垃圾邮件进行分类,auc为73.3%,本篇讲继续讲如何用PaddlePaddle实现邮件分类,将深度 ...

  2. 【深度学习系列】PaddlePaddle之手写数字识别

    上周在搜索关于深度学习分布式运行方式的资料时,无意间搜到了paddlepaddle,发现这个框架的分布式训练方案做的还挺不错的,想跟大家分享一下.不过呢,这块内容太复杂了,所以就简单的介绍一下padd ...

  3. 【深度学习系列】PaddlePaddle垃圾邮件处理实战(一)

    PaddlePaddle垃圾邮件处理实战(一) 背景介绍   在我们日常生活中,经常会受到各种垃圾邮件,譬如来自商家的广告.打折促销信息.澳门博彩邮件.理财推广信息等,一般来说邮件客户端都会设置一定的 ...

  4. 【深度学习系列】PaddlePaddle可视化之VisualDL

    上篇文章我们讲了如何对模型进行可视化,用的keras手动绘图输出CNN训练的中途结果,本篇文章将讲述如何用PaddlePaddle新开源的VisualDL来进行可视化.在讲VisualDL之前,我们先 ...

  5. 【深度学习系列】PaddlePaddle之数据预处理

    上篇文章讲了卷积神经网络的基本知识,本来这篇文章准备继续深入讲CNN的相关知识和手写CNN,但是有很多同学跟我发邮件或私信问我关于PaddlePaddle如何读取数据.做数据预处理相关的内容.网上看的 ...

  6. 【深度学习系列3】 Mariana CNN并行框架与图像识别

    [深度学习系列3] Mariana CNN并行框架与图像识别 本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框 ...

  7. 【深度学习系列2】Mariana DNN多GPU数据并行框架

    [深度学习系列2]Mariana DNN多GPU数据并行框架  本文是腾讯深度学习系列文章的第二篇,聚焦于腾讯深度学习平台Mariana中深度神经网络DNN的多GPU数据并行框架.   深度神经网络( ...

  8. 深度学习系列 Part(3)

    这是<GPU学习深度学习>系列文章的第三篇,主要是接着上一讲提到的如何自己构建深度神经网络框架中的功能模块,进一步详细介绍 Tensorflow 中 Keras 工具包提供的几种深度神经网 ...

  9. 基于TensorFlow的深度学习系列教程 2——常量Constant

    前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图.本篇则着重介绍和整理下Constant相关的内容. 基于TensorFlow的深度学习系列教程 1--Hell ...

随机推荐

  1. minicom在虚拟机(linux)安装配置过程

    1. minicom须要ncurses库的支持.否则安装会有问题. A. 下载ncurses.我选择是ncurses-5.6.tar.gz 下载地址:http://directory.fsf.org/ ...

  2. JavaScript获取浏览器版本等信息

    ** 不同浏览器版本可能存在差异,使用时请测试自己的环境 ** 测试时各个浏览器版本 IE: 11.953.14393.0 Edge: Microsoft Edge 38.14393.0.0;Micr ...

  3. wordpess关闭评论的方法,wordpress开发

    由于某种原因,需要把wordpress的评论关闭,下面讲一下方法. 在wordpress模板中,找到文章模板页面文件single.php,在里面找到 <?php comments_templat ...

  4. 学习Git的最佳资料

    1. ProGit中文版:https://git-scm.com/book/zh/v2 2. 廖雪峰的Git教程: http://www.liaoxuefeng.com/wiki/0013739516 ...

  5. 【正则表达式】匹配时间格式:hh:mm或h:m

    ^(0?[0-9]|1[0-9]|2[0-3]):(0?[0-9]|[1-5][0-9])$

  6. JMeter接口测试系列:Jmeter+jenkins+ant 的自动化构建

    在JMeter接口测试不断深入的过程中,发现可以和jenkins和ant一起搭配进行自动化的构建.下面是jmeter自动化构建的整理笔记. 准备环境 需要本机上确定安装了jmeter.ant和jenk ...

  7. [array] leetcode-55. Jump Game - Medium

    leetcode-55. Jump Game - Medium descrition Given an array of non-negative integers, you are initiall ...

  8. [置顶] Xamarin android中使用signalr实现即时通讯

    前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你 ...

  9. AntData.ORM框架 之 DotnetCore

    开源地址:https://github.com/yuzd/AntData.ORM   CodeGen使用请参考http://www.cnblogs.com/yudongdong/p/6421312.h ...

  10. 理解new构造函数和apply以及call

    今天在看设计模式的时候,遇到一些挺低级的东西,搞不懂,顾查阅资料整理记录一番. 先了解一下new构造函数的过程: function func(){ console.log('do'); } var f ...