【深度學習系列】關於PaddlePaddle的一些避「坑」技巧 【深度學習系列】PaddlePaddle之數據預處理

  最近除了工做之外,業餘在參加Paddle的AI比賽,在用Paddle訓練的過程當中遇到了一些問題,並找到了解決方法,跟你們分享一下:html


PaddlePaddle的Anaconda的兼容問題python

  以前我是在服務器上安裝的PaddlePaddle的gpu版本,我想把BROAD數據拷貝到服務器上面,結果發現咱們服務器的22端口沒開,不能用scp傳上去,很是鬱悶,只能在本地訓練。本機mac的顯卡是A卡,因此只能裝cpu版本的,安裝完之後,我發現運行一下程序的時候報錯了:c++

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

   報錯:git

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:github

  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來替換依賴python2.7

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就不會有問題了post

   不過要注意一點的是:在第二步中,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)

 

  還有一些關於模型訓練的參數設置技巧你們能夠多嘗試,若是有不少相同的問題話,我會再總結了發出來。

相關文章
相關標籤/搜索