日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

paddlepaddle系列之三行代码从入门到精通

發(fā)布時間:2025/3/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 paddlepaddle系列之三行代码从入门到精通 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

PaddlePaddle系列之三行代碼從入門到精通

前言

這將是PaddlePaddle系列教程的開篇,屬于非官方教程。既然是非官方,自然會從一個使用者的角度出發(fā),來教大家怎么用,會有哪些坑,以及如何上手并用到實際項目中去。

我之前寫過一些關(guān)于tensorflow的教程,在我的簡書上可以找到,非常簡單基礎(chǔ)的一個教程,但是備受好評,因為國內(nèi)實在是很難找到一個系列的關(guān)于這些深度學(xué)習(xí)框架的教程。因此在這里,我來給PaddlePaddle也寫一個類似的教程,不復(fù)雜,三行代碼入門。

三行代碼PaddlePaddle從入門到精通

PaddlePaddle是百度大力推出的一個框架,不得不說相比于tensorflow,PaddlePaddle會簡單很多,接下來我會細(xì)說。同時百度在人工智能方面的功底還是非常深厚,我曾經(jīng)在騰訊實習(xí),類似于AT這樣的公司,甚至沒有一個非常成型的框架存在。

既然是三行代碼精通PaddlePaddle,那么得安裝一下PaddlePaddle。就目前來說,最好的辦法是build from source。步驟如下 (注意,這里是CPU版本,GPU版本的源碼編譯過程后續(xù)補(bǔ)充,我們先用CPU來熟悉API):

# clone 最新代碼到paddlegit clone https://github.com/PaddlePaddle/Paddle paddlecd paddlemkdir buildcd buildcmake ..make all -j8sudo make install# 安裝python接口,注意paddlepaddle目前貌似只支持python2,因此在寫腳本的時候一定要兼容一下python3# 這里是mac的情況下,如果是ubuntu /usr/local/opt 應(yīng)該直接是/opt/sudo python -m pip install /usr/local/opt/paddle/share/wheels/*.whl# 或者直接sudo pip2 install /usr/local/opt/paddle/share/wheels/*.whl

好了,看上去應(yīng)該算是安裝完了。接下來我們用三行代碼來測試一下?

PaddlePaddle在python API上0.10有較大的變化,所以直接import一下v2版本的API。如果可以說明PaddlePaddle安裝沒有問題。這里贊一下百度的技術(shù)功底和用戶體驗,這尼瑪要是caffe或者caffe2編譯出錯概率100%不說,python安裝了也不能import,PaddlePaddle一步到位,非常牛逼。

閑話不多說,直接三行代碼來熟悉一下PaddlePaddle的API。

三行代碼來了

接下來要做的事情是,用PaddlePaddle搭建一個3層MLP網(wǎng)絡(luò),跑一個二維的numpy隨機(jī)數(shù)據(jù),來了解一下PaddlePaddle從數(shù)據(jù)喂入到訓(xùn)練的整個pipeline吧。

首先我們這個教程先給大家展示一個圖片分類器,用到的數(shù)據(jù)集是Stanford Dogs 數(shù)據(jù)集,?下載鏈接, 大概800M, 同時下載一下annotations, 大概21M。下載好了我們用一個paddle_test的文件夾來做這個教程吧。

mkdir paddle_testcd paddle_testmkdir data

把所有的images 和 annotations扔到data里面去,解壓一下:

paddle_test└── data├── annotation.tar└── images.tar

順便說一下,這里的annotations是為后面用paddlepaddle做分割做準(zhǔn)備,本次分類任務(wù),只需要一個images.tar就可以了,所有圖片被放在了該類別的文件夾下面,以后處理其他分類任務(wù)時,只需要把不同類別放在文件夾就OK了,甚至不用改代碼,非常方便,這比MXNet要有道理很多,多數(shù)情況下我們根本不需要海量圖片訓(xùn)練,也沒有必要搞個什么imrecord的數(shù)據(jù)格式,MXNet導(dǎo)入圖片真心蛋疼,沒有Pytorch方便,但是Pytorch得運行速度堪憂。

OK,將images.tar解壓,會得到120個文件夾,也就是120個類別,每個類別里面都是一種狗狗圖片。比如這張是一只 Beagle:

我們現(xiàn)在要來處理一下這些蠢狗。

開始寫三行代碼

好了,開始寫三行代碼了.

def vgg_bn_drop(input_data):def event_handler(event):def train():

實際上PaddlePaddle的使用也就是三行代碼的事情,首先是網(wǎng)絡(luò)構(gòu)建,這里我們構(gòu)建一個VGG網(wǎng)絡(luò),其次是event的處理函數(shù),這個機(jī)制是PaddlePaddle獨有的,PaddlePaddle把所有的訓(xùn)練過程都包裝成了一個trainer,然后調(diào)用這個event_handler來處理比如打印loss信息這樣的事情。OK,我們一步一步來,先來看一下train的過程把:

def train():data_dim = 3 * 32 * 32class_dim = 10image = paddle.layer.data(name="image", type=paddle.data_type.dense_vector(data_dim))net = vgg_bn_drop(image)out = paddle.layer.fc(input=net,size=class_dim,act=paddle.activation.Softmax())lbl = paddle.layer.data(name="label", type=paddle.data_type.integer_value(class_dim))cost = paddle.layer.classification_cost(input=out, label=lbl)parameters = paddle.parameters.create(cost)print(parameters.keys())momentum_optimizer = paddle.optimizer.Momentum(momentum=0.9,regularization=paddle.optimizer.L2Regularization(rate=0.0002 * 128),learning_rate=0.1 / 128.0,learning_rate_decay_a=0.1,learning_rate_decay_b=50000 * 100,learning_rate_schedule='discexp') # Create trainertrainer = paddle.trainer.SGD(cost=cost,parameters=parameters,update_equation=momentum_optimizer)reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.cifar.train10(), buf_size=50000),batch_size=128)feeding = {'image': 0, 'label': 1}trainer.train(reader=reader,num_passes=200,event_handler=event_handler,feeding=feeding)

PaddlePaddle的網(wǎng)絡(luò)訓(xùn)練流程分為幾個步驟:

  • 首先定義網(wǎng)絡(luò),這里的網(wǎng)絡(luò)不包括最后一層的softmax;
  • 創(chuàng)建一個cost,cost當(dāng)然就需要一個網(wǎng)絡(luò)的輸出和lable了;
  • 通過這個cost來創(chuàng)建網(wǎng)絡(luò)訓(xùn)練的參數(shù),非常簡單明了;
  • 最后是優(yōu)化器,這里定義反向傳播的正則項,學(xué)習(xí)速率調(diào)整策略等;
  • 通過上面這些創(chuàng)建一個trainer;
  • 最后這個trainer要訓(xùn)練起來,還需要持續(xù)的數(shù)據(jù)喂入,時間處理函數(shù),和喂入的方式。

接著我們看一下網(wǎng)絡(luò)定義和事件處理函數(shù):

# define VGG networkdef vgg_bn_drop(input_data): def convolution_block(ipt, num_filter, groups, dropouts, num_channels=None): return paddle.networks.img_conv_group(input=ipt,num_channels=num_channels,pool_size=2,pool_stride=2,conv_num_filter=[num_filter] * groups,conv_filter_size=3,conv_act=paddle.activation.Relu(),conv_with_batchnorm=True,conv_batchnorm_drop_rate=dropouts,pool_type=paddle.pooling.Max())convolution_1 = convolution_block(input_data, 64, 2, [0.3, 0], 3)convolution_2 = convolution_block(convolution_1, 128, 2, [0.4, 0])convolution_3 = convolution_block(convolution_2, 256, 3, [0.4, 0.4, 0])convolution_4 = convolution_block(convolution_3, 512, 3, [0.4, 0.4, 0])convolution_5 = convolution_block(convolution_4, 512, 3, [0.4, 0.4, 0])drop = paddle.layer.dropout(input=convolution_5, dropout_rate=0.5)fc1 = paddle.layer.fc(input=drop, size=512, act=paddle.activation.Linear())bn = paddle.layer.batch_norm(input=fc1,act=paddle.activation.Relu(),layer_attr=paddle.attr.Extra(drop_rate=0.5))fc2 = paddle.layer.fc(input=bn, size=512, act=paddle.activation.Linear()) return fc2def event_handler(event): if isinstance(event, paddle.event.EndIteration): if event.batch_id % 100 == 0:print("\nPass %d, Batch %d, Cost %f, %s" % (event.pass_id, event.batch_id, event.cost, event.metrics)) else:sys.stdout.write('.')sys.stdout.flush()

這里我們先用PaddlePaddle內(nèi)置的cifar10來測試一下能否訓(xùn)練起來,把上面的代碼加上import之后:

from __future__ import print_function, divisionimport paddle.v2 as paddleimport syspaddle.init(use_gpu=False, trainer_count=1)if __name__ == '__main__':train()

在主函數(shù)里面運行train()。見證奇跡的時刻到了。。

PaddlePaddle開始下載數(shù)據(jù),并打印出了網(wǎng)絡(luò)結(jié)構(gòu)!

so far so good,PaddlePaddle開始訓(xùn)練網(wǎng)絡(luò)!!!

牛逼了我的哥。接下來我們用這個代碼來保存網(wǎng)絡(luò)訓(xùn)練之后的權(quán)重:

try:trainer.train(reader=reader,num_passes=200,event_handler=event_handler,feeding=feeding)except KeyboardInterrupt: with open('params_model.tar', 'w') as f:parameters.to_tar(f)

最后,模型train好之后,導(dǎo)入模型進(jìn)行預(yù)測:

from __future__ import print_functionfrom PIL import Imageimport numpy as npimport osdef load_image(file):im = Image.open(file)im = im.resize((32, 32), Image.ANTIALIAS)im = np.array(im).astype(np.float32) # PIL打開圖片存儲順序為H(高度),W(寬度),C(通道)。 # PaddlePaddle要求數(shù)據(jù)順序為CHW,所以需要轉(zhuǎn)換順序。im = im.transpose((2, 0, 1)) # CHW # CIFAR訓(xùn)練圖片通道順序為B(藍(lán)),G(綠),R(紅), # 而PIL打開圖片默認(rèn)通道順序為RGB,因為需要交換通道。im = im[(2, 1, 0),:,:] # BGRim = im.flatten()im = im / 255.0 return imtest_data = []cur_dir = os.getcwd()test_data.append((load_image(cur_dir + '/image/dog.png'),))# with open('params_pass_50.tar', 'r') as f:# parameters = paddle.parameters.Parameters.from_tar(f)probs = paddle.infer(output_layer=out, parameters=parameters, input=test_data)lab = np.argsort(-probs) # probs and lab are the results of one batch dataprint("Label of image/dog.png is: %d" % lab[0][0])

OK, 本次列車到此結(jié)束,對于PaddlePaddle如何訓(xùn)練一個圖片分類器,應(yīng)該有了一個清醒的認(rèn)識,下一步,我們將繼續(xù)….用PaddlePaddle實現(xiàn)一個NLP情感分類器!

本文由在當(dāng)?shù)剌^為英俊的男子金天大神原創(chuàng),版權(quán)所有,歡迎轉(zhuǎn)載,本文首發(fā)地址?https://jinfagang.github.io?。但請保留這段版權(quán)信息,多謝合作,有任何疑問歡迎通過微信聯(lián)系我交流:jintianiloveu


總結(jié)

以上是生活随笔為你收集整理的paddlepaddle系列之三行代码从入门到精通的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。