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

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


PaddlePaddle的Anaconda的兼容问题

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

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

报错:

1 Fatal Python error: PyThreadState_Get: no current thread
2 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,但实际系统中不存在该路径

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

2.利用install_name_tool来替换依赖

1 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下的路径了

1 otool -L /anaconda/lib/python2.7/site-packages/py_paddle/_swig_paddle.so
2 /anaconda/lib/python2.7/site-packages/py_paddle/_swig_paddle.so:
3 /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1445.12.0)
4 /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 58286.20.16)
5 /anaconda/lib/libpython2.7.dylib (compatibility version 2.7.0, current version 2.7.0)
6 /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
7 /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]],那么我们可以看到这个数据有三个时间步长,每个时间步的向量维度是2,应该设置为:

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

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

2.不知道如何创建reader

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

1 def reader_creator(data,label):
2     def reader():
3         for i in xrange(len(data)):
4             yield data[i,:],int(label[i])
5     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)

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

vivi虚拟摄像头驱动程序

一、vivi虚拟摄像头驱动 基于V4L2(video for linux 2)摄像头驱动程序,我们减去不需要的ioctl_fops的函数,只增加ioctl函数增...

55040
来自专栏哈雷彗星撞地球

Objective-C 中如何测量代码的效率背景

因此,我们不可避免的要用到一些方法来计算代码的执行效率。计算代码的执行效率可以使用的API有:

15250
来自专栏吉浦迅科技

DAY31:阅读global memory

11420
来自专栏mukekeheart的iOS之旅

MySQL学习笔记(一)

一、MySQL基础知识 MySQL 是一个真正的多用户、多线程 SQL 数据库服务器。 SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。MySQL...

26780
来自专栏SeanCheney的专栏

《Python数据分析》2nd

《Python数据分析》(Python for Data Analysis, 2nd Edition)第二版出了,目前还没有中文版,这版的代码适用于Python...

42680
来自专栏轮子工厂

教你用翻译软件快速阅读大量英文文献

对于一些引用的英文文献,我们需要快速地了解整篇文献讲了什么内容,来判断是否可以作为“国内外研究现状”来进行详细分析。

26940
来自专栏生信技能树

rMATS这款差异可变剪切分析软件的使用体验

rMATS最近刚现在出了rMATS 4.0.1版,相比之间的rMATS 3.2.5版,其用C,Python,Cython重写了该软件,运算速度提升了100倍,并...

1.7K50
来自专栏逸鹏说道

Toxy新手教程

Toxy新手教程 官方网站:http://toxy.codeplex.com Toxy是干嘛用的?它是.NET平台上的文件抽取框架,主要解决各种格式的内容抽取问...

31260
来自专栏飞雪无情的博客

Go语言实战笔记(二十二)| Go 基准测试

基准测试,是一种测试代码性能的方法,比如你有多种不同的方案,都可以解决问题,那么到底是那种方案性能更好呢?这时候基准测试就派上用场了。

13130
来自专栏Python中文社区

Python量子力学计算模拟以及数据可视化

專 欄 ❈Pytlab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,...

1K90

扫码关注云+社区

领取腾讯云代金券