最近除了工作以外,业余在参加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进行修改就可以,参考了下github的issue:
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)
还有一些关于模型训练的参数设置技巧大家可以多尝试,如果有很多相同的问题话,我会再总结了发出来。