<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【深度學習系列】手寫數字識別實戰

        上周在搜索關于深度學習分布式運行方式的資料時,無意間搜到了paddlepaddle,發現這個框架的分布式訓練方案做的還挺不錯的,想跟大家分享一下。不過呢,這塊內容太復雜了,所以就簡單的介紹一下paddlepaddle的第一個“hello word”程序----mnist手寫數字識別。下一次再介紹用PaddlePaddle做分布式訓練的方案。其實之前也寫過一篇用CNN識別手寫數字集的文章(鏈接戳這里~),是用keras實現的,這次用了paddlepaddle后,正好可以簡單對比一下兩個框架的優劣。
       
      什么是PaddlePaddle?
        PaddlePaddle是百度推出的一個深度學習框架,可能大多數人平常用的比較多的一般是tensorflow,caffe,mxnet等,但其實PaddlePaddle也是一個非常不錯的框架(據說以前叫Paddle,現在改名叫PaddlePaddle,不知道為啥總覺得有股莫名的萌點)
       
      PaddlePaddle能做什么?
        傳統的基本都能做,尤其對NLP的支持很好,譬如情感分析,word embedding,語言模型等,反正你想得到的,常見的都可以用它來試一試~
       
      PaddlePaddle的安裝
        不得不吐槽一下PaddlePaddle的安裝,官網上說“PaddlePaddle目前唯一官方支持的運行的方式是Docker容器”,而docker其實在國內還并不是特別的流行,之前遇到的所有的框架,都有很多種安裝方式,非常方便,所以這個唯一支持docker讓人覺得非常詭異 = =!不過偶然試了一下,居然可以用pip install,不過為啥官網上沒有寫呢?所以,對于新手來說,最簡單的安裝方式就是:
      • CPU版本安裝

              pip install paddlepaddle 

      • GPU版本安裝

              pip install paddlepaddle-gpu 

       
       用PaddlePaddle實現手寫數字識別
        訓練步驟
        傳統的方式這次就不展開講了,為了對比我們還是用CNN來進行訓練。PaddlePaddle訓練一次模型完整的過程可以如下幾個步驟:
      導入數據---->定義網絡結構---->訓練模型---->保存模型---->測試結果  
        下面,我直接用代碼來展示訓練的過程(以后代碼都會放在github里):
       
      #coding:utf-8
      import os
      from PIL import Image
      import numpy as np
      import paddle.v2 as paddle
      
      # 設置是否用gpu,0為否,1為是
      with_gpu = os.getenv('WITH_GPU', '0') != '1'
      
      # 定義網絡結構
      def convolutional_neural_network_org(img):
          # 第一層卷積層
          conv_pool_1 = paddle.networks.simple_img_conv_pool(
              input=img,
              filter_size=5,
              num_filters=20,
              num_channel=1,
              pool_size=2,
              pool_stride=2,
              act=paddle.activation.Relu())
          # 第二層卷積層
          conv_pool_2 = paddle.networks.simple_img_conv_pool(
              input=conv_pool_1,
              filter_size=5,
              num_filters=50,
              num_channel=20,
              pool_size=2,
              pool_stride=2,
              act=paddle.activation.Relu())
          # 全連接層
          predict = paddle.layer.fc(
              input=conv_pool_2, size=10, act=paddle.activation.Softmax())
          return predict
      
      def main():
          # 初始化定義跑模型的設備
          paddle.init(use_gpu=with_gpu, trainer_count=1)
      
          # 讀取數據
          images = paddle.layer.data(
              name='pixel', type=paddle.data_type.dense_vector(784))
          label = paddle.layer.data(
              name='label', type=paddle.data_type.integer_value(10))
      
          # 調用之前定義的網絡結構
          predict = convolutional_neural_network_org(images)
      
          # 定義損失函數
          cost = paddle.layer.classification_cost(input=predict, label=label)
      
          # 指定訓練相關的參數
          parameters = paddle.parameters.create(cost)
      
          # 定義訓練方法
          optimizer = paddle.optimizer.Momentum(
              learning_rate=0.1 / 128.0,
              momentum=0.9,
              regularization=paddle.optimizer.L2Regularization(rate=0.0005 * 128))
      
          # 訓練模型
          trainer = paddle.trainer.SGD(
              cost=cost, parameters=parameters, update_equation=optimizer)
      
      
          lists = []
      
          # 定義event_handler,輸出訓練過程中的結果
          def event_handler(event):
              if isinstance(event, paddle.event.EndIteration):
                  if event.batch_id % 100 == 0:
                      print "Pass %d, Batch %d, Cost %f, %s" % (
                          event.pass_id, event.batch_id, event.cost, event.metrics)
              if isinstance(event, paddle.event.EndPass):
                  # 保存參數
                  with open('params_pass_%d.tar' % event.pass_id, 'w') as f:
                      parameters.to_tar(f)
      
                  result = trainer.test(reader=paddle.batch(
                      paddle.dataset.mnist.test(), batch_size=128))
                  print "Test with Pass %d, Cost %f, %s\n" % (
                      event.pass_id, result.cost, result.metrics)
                  lists.append((event.pass_id, result.cost,
                                result.metrics['classification_error_evaluator']))
      
          trainer.train(
              reader=paddle.batch(
                  paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=8192),
                  batch_size=128),
              event_handler=event_handler,
              num_passes=10)
      
          # 找到訓練誤差最小的一次結果
          best = sorted(lists, key=lambda list: float(list[1]))[0]
          print 'Best pass is %s, testing Avgcost is %s' % (best[0], best[1])
          print 'The classification accuracy is %.2f%%' % (100 - float(best[2]) * 100)
      
          # 加載數據   
          def load_image(file):
              im = Image.open(file).convert('L')
              im = im.resize((28, 28), Image.ANTIALIAS)
              im = np.array(im).astype(np.float32).flatten()
              im = im / 255.0
              return im
      
          # 測試結果
          test_data = []
          cur_dir = os.path.dirname(os.path.realpath(__file__))
          test_data.append((load_image(cur_dir + '/image/infer_3.png'), ))
      
          probs = paddle.infer(
              output_layer=predict, parameters=parameters, input=test_data)
          lab = np.argsort(-probs)  # probs and lab are the results of one batch data
          print "Label of image/infer_3.png is: %d" % lab[0][0]
      
      
      if __name__ == '__main__':
          main()
        上面的代碼看起來很長,但結構還是很清楚的。下面我們用實際數據測試一下,看一下效果到底怎么樣~
       

        BaseLine版本
       
        首先我用了官網給出的例子,直接用最基本的CNN網絡結構訓練了一下,代碼如下: 
       1 def convolutional_neural_network_org(img):
       2     # 第一層卷積層
       3     conv_pool_1 = paddle.networks.simple_img_conv_pool(
       4         input=img,
       5         filter_size=5,
       6         num_filters=20,
       7         num_channel=1,
       8         pool_size=2,
       9         pool_stride=2,
      10         act=paddle.activation.Relu())
      11     # 第二層卷積層
      12     conv_pool_2 = paddle.networks.simple_img_conv_pool(
      13         input=conv_pool_1,
      14         filter_size=5,
      15         num_filters=50,
      16         num_channel=20,
      17         pool_size=2,
      18         pool_stride=2,
      19         act=paddle.activation.Relu())
      20     # 全連接層
      21     predict = paddle.layer.fc(
      22         input=conv_pool_2, size=10, act=paddle.activation.Softmax())
      23     return predict

        輸出結果如下:

      I1023 13:45:46.519075 34144 Util.cpp:166] commandline:  --use_gpu=True --trainer_count=1
      [INFO 2017-10-23 13:45:52,667 layers.py:2539] output for __conv_pool_0___conv: c = 20, h = 24, w = 24, size = 11520
      [INFO 2017-10-23 13:45:52,667 layers.py:2667] output for __conv_pool_0___pool: c = 20, h = 12, w = 12, size = 2880
      [INFO 2017-10-23 13:45:52,668 layers.py:2539] output for __conv_pool_1___conv: c = 50, h = 8, w = 8, size = 3200
      [INFO 2017-10-23 13:45:52,669 layers.py:2667] output for __conv_pool_1___pool: c = 50, h = 4, w = 4, size = 800
      I1023 13:45:52.675750 34144 GradientMachine.cpp:85] Initing parameters..
      I1023 13:45:52.686153 34144 GradientMachine.cpp:92] Init parameters done.
      Pass 0, Batch 0, Cost 3.048408, {'classification_error_evaluator': 0.890625}
      Pass 0, Batch 100, Cost 0.188828, {'classification_error_evaluator': 0.0546875}
      Pass 0, Batch 200, Cost 0.075183, {'classification_error_evaluator': 0.015625}
      Pass 0, Batch 300, Cost 0.070798, {'classification_error_evaluator': 0.015625}
      Pass 0, Batch 400, Cost 0.079673, {'classification_error_evaluator': 0.046875}
      Test with Pass 0, Cost 0.074587, {'classification_error_evaluator': 0.023800000548362732}
      ```
      ```
      ```
      Pass 4, Batch 0, Cost 0.032454, {'classification_error_evaluator': 0.015625}
      Pass 4, Batch 100, Cost 0.021028, {'classification_error_evaluator': 0.0078125}
      Pass 4, Batch 200, Cost 0.020458, {'classification_error_evaluator': 0.0}
      Pass 4, Batch 300, Cost 0.046728, {'classification_error_evaluator': 0.015625}
      Pass 4, Batch 400, Cost 0.030264, {'classification_error_evaluator': 0.015625}
      Test with Pass 4, Cost 0.035841, {'classification_error_evaluator': 0.01209999993443489}
      
      Best pass is 4, testing Avgcost is 0.0358410408473
      The classification accuracy is 98.79%
      Label of image/infer_3.png is: 3
      
      real    0m31.565s
      user    0m20.996s
      sys    0m15.891s

        可以看到,第一行輸出選擇的設備是否是gpu,這里我選擇的是gpu,所以等于1,如果是cpu,就是0。接下來四行輸出的是網絡結構,然后開始輸出訓練結果,訓練結束,我們把這幾次迭代中誤差最小的結果輸出來,98.79%,效果還是很不錯的,畢竟只迭代了5次。最后看一下輸出時間,非常快,約31秒。然而這個結果我并不是特別滿意,因為之前用keras做的時候調整的網絡模型訓練往后準確率能夠達到99.72%,不過速度非常慢,迭代69次大概需要30分鐘左右,所以我覺得這個網絡結構還是可以改進一下的,所以我對這個網絡結構改進了一下,請看改進版

       


        改進版 

      def convolutional_neural_network(img):
          # 第一層卷積層
          conv_pool_1 = paddle.networks.simple_img_conv_pool(
              input=img,
              filter_size=5,
              num_filters=20,
              num_channel=1,
              pool_size=2,
              pool_stride=2,
              act=paddle.activation.Relu())
          # 加一層dropout層
          drop_1 = paddle.layer.dropout(input=conv_pool_1, dropout_rate=0.2)
          # 第二層卷積層
          conv_pool_2 = paddle.networks.simple_img_conv_pool(
              input=drop_1,
              filter_size=5,
              num_filters=50,
              num_channel=20,
              pool_size=2,
              pool_stride=2,
              act=paddle.activation.Relu())
          # 加一層dropout層
          drop_2 = paddle.layer.dropout(input=conv_pool_2, dropout_rate=0.5)
          # 全連接層
          fc1 = paddle.layer.fc(input=drop_2, size=10, act=paddle.activation.Linear())
          bn = paddle.layer.batch_norm(input=fc1,act=paddle.activation.Relu(),
               layer_attr=paddle.attr.Extra(drop_rate=0.2))
          predict = paddle.layer.fc(input=bn, size=10, act=paddle.activation.Softmax())
          return predict

       

        在改進版里我們加了一些dropout層來避免過擬合。分別在第一層卷積層和第二層卷積層后加了dropout,閾值設為0.5。改變網絡結構也非常簡單,直接在定義的網絡結構函數里對模型進行修改即可,這一點其實和keras的網絡結構定義方式還是挺像的,易用性很高。下面來看看效果:
      I1023 14:01:51.653827 34244 Util.cpp:166] commandline:  --use_gpu=True --trainer_count=1
      [INFO 2017-10-23 14:01:57,830 layers.py:2539] output for __conv_pool_0___conv: c = 20, h = 24, w = 24, size = 11520
      [INFO 2017-10-23 14:01:57,831 layers.py:2667] output for __conv_pool_0___pool: c = 20, h = 12, w = 12, size = 2880
      [INFO 2017-10-23 14:01:57,832 layers.py:2539] output for __conv_pool_1___conv: c = 50, h = 8, w = 8, size = 3200
      [INFO 2017-10-23 14:01:57,833 layers.py:2667] output for __conv_pool_1___pool: c = 50, h = 4, w = 4, size = 800
      I1023 14:01:57.842871 34244 GradientMachine.cpp:85] Initing parameters..
      I1023 14:01:57.854014 34244 GradientMachine.cpp:92] Init parameters done.
      Pass 0, Batch 0, Cost 2.536199, {'classification_error_evaluator': 0.875}
      Pass 0, Batch 100, Cost 1.668236, {'classification_error_evaluator': 0.515625}
      Pass 0, Batch 200, Cost 1.024846, {'classification_error_evaluator': 0.375}
      Pass 0, Batch 300, Cost 1.086315, {'classification_error_evaluator': 0.46875}
      Pass 0, Batch 400, Cost 0.767804, {'classification_error_evaluator': 0.25}
      Pass 0, Batch 500, Cost 0.545784, {'classification_error_evaluator': 0.1875}
      Pass 0, Batch 600, Cost 0.731662, {'classification_error_evaluator': 0.328125}
      ```
      ```
      ```
      Pass 49, Batch 0, Cost 0.415184, {'classification_error_evaluator': 0.09375}
      Pass 49, Batch 100, Cost 0.067616, {'classification_error_evaluator': 0.0}
      Pass 49, Batch 200, Cost 0.161415, {'classification_error_evaluator': 0.046875}
      Pass 49, Batch 300, Cost 0.202667, {'classification_error_evaluator': 0.046875}
      Pass 49, Batch 400, Cost 0.336043, {'classification_error_evaluator': 0.140625}
      Pass 49, Batch 500, Cost 0.290948, {'classification_error_evaluator': 0.125}
      Pass 49, Batch 600, Cost 0.223433, {'classification_error_evaluator': 0.109375}
      Pass 49, Batch 700, Cost 0.217345, {'classification_error_evaluator': 0.0625}
      Pass 49, Batch 800, Cost 0.163140, {'classification_error_evaluator': 0.046875}
      Pass 49, Batch 900, Cost 0.203645, {'classification_error_evaluator': 0.078125}
      Test with Pass 49, Cost 0.033639, {'classification_error_evaluator': 0.008100000210106373}
      
      Best pass is 48, testing Avgcost is 0.0313018567383
      The classification accuracy is 99.28%
      Label of image/infer_3.png is: 3
      
      real    5m3.151s
      user    4m0.052s
      sys    1m8.084s

       

        從上面的數據來看,這個效果還是很不錯滴,對比之前用keras訓練的效果來看,結果如下:
                          
       
       
        可以看到這個速度差異是很大的了,在準確率差不多的情況下,訓練時間幾乎比原來縮短了六倍,網絡結構也相對簡單,說明需要調整的參數也少了很多。
       
      總結
        paddlepaddle用起來還是很方便的,不論是定義網絡結構還是訓練速度,都值得一提,然而我個人的體驗中,認為最值得說的是這幾點:
       
      1.導入數據方便。這次訓練的手寫數字識別數據量比較小,但是如果想要添加數據,也非常方便,直接添加到相應目錄下。
      2.event_handler機制,可以自定義訓練結果輸出內容。之前用的keras,以及mxnet等都是已經封裝好的函數,輸出信息都是一樣的,這里paddlepaddle把這個函數并沒有完全封裝,而是讓我們用戶自定義輸出的內容,可以方便我們減少冗余的信息,增加一些模型訓練的細節的輸出,也可以用相應的函數畫出模型收斂的圖片,可視化收斂曲線。
      3.速度快。上面的例子已經證明了paddlepaddle的速度,并且在提升速度的同時,模型準確度也與最優結果相差不多,這對于我們訓練海量數據的模型是一個極大的優勢啊!
       
      然而,paddlepaddle也有幾點讓我用的有點難受,譬如文檔太少了啊,報錯了上網上搜沒啥結果啊等等,不過我覺得這個應該不是大問題,以后用的人多了以后肯定相關資料也會更多。所以一直很疑惑,為啥paddlepaddle不火呢?安裝詭異是一個吐槽點,但其實還是很優秀的一個開源軟件,尤其是最值得說的分布式訓練方式,多機多卡的設計是非常優秀的,本篇沒有講,下次講講如何用paddlepaddle做單機單卡,單機多卡,多機單卡和多機多卡的訓練方式來訓練模型,大家多多用起來呀~~可以多交流呀~
       
      ps:由于paddlepaddle的文檔實在太少了,官網的文章理論介紹的比較多,網上的博文大多數都是幾個經典例子來回跑,所以我打算寫個系列,跟實戰相關的,不再只有深度學習的“hello world”程序,這次用“hello world”做個引子,下篇開始寫點干貨哈哈~
       
       
        
       
        
       
      posted @ 2017-10-23 14:33  Charlotte77  閱讀(30572)  評論(23)    收藏  舉報
      主站蜘蛛池模板: 新建县| 日本乱一区二区三区在线| 欧美精品在线观看视频| 欧美日韩v| 日本一卡2卡3卡四卡精品网站| 欧美国产成人精品二区芒果视频 | 人成午夜免费大片| 日韩国产欧美精品在线| 加勒比无码av中文字幕| 少妇xxxxx性开放| 国产成人综合色视频精品| 偷窥国产亚洲免费视频| 长垣县| 精品精品国产国产自在线| 视频一区视频二区制服丝袜| 国产内射XXXXX在线| 亚洲av午夜成人片| 国产日韩综合av在线| 亚洲国产成人久久精品APP | 三级国产在线观看| 激情六月丁香婷婷四房播| 亚洲一区二区三区自拍高清| 亚洲有无码中文网| 国产精品SM捆绑调教视频| 国产精品一二二区视在线| 久久天天躁夜夜躁狠狠820175| 少妇粗大进出白浆嘿嘿视频| 日韩精品一二三黄色一级| 91久久精品美女高潮不断| h动态图男女啪啪27报gif| 美欧日韩一区二区三区视频| 亚洲aⅴ男人的天堂在线观看| 亚洲中文字幕人妻系列| 精品一日韩美女性夜视频| 亚洲日韩av无码中文字幕美国 | 中文天堂资源| 免费A级毛片中文字幕| 新沂市| 99久久激情国产精品| 亚洲中文字幕无码不卡电影| 国产线播放免费人成视频播放|