久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        百度推出飛槳(PaddlePaddle)后,不少開(kāi)發(fā)者開(kāi)始轉(zhuǎn)向國(guó)內(nèi)的深度學(xué)習(xí)框架。但是從代碼的轉(zhuǎn)移談何容易,之前的工作重寫一遍不太現(xiàn)實(shí),成千上萬(wàn)行代碼的手工轉(zhuǎn)換等于是在做一次二次開(kāi)發(fā)。

        現(xiàn)在,有個(gè)好消息:無(wú)論Caffe、TensorFlow、ONNX都可以輕松遷移到飛槳平臺(tái)上。雖然目前還不直接遷移PyTorch模型,但PyTorch本身支持導(dǎo)出為ONNX模型,等于間接對(duì)該平臺(tái)提供了支持。

        然而,有人還對(duì)存在疑惑:不同框架之間的API有沒(méi)有差異?整個(gè)遷移過(guò)程如何操作,步驟復(fù)雜嗎?遷移后如何保證精度的損失在可接受的范圍內(nèi)?

        大家會(huì)考慮很多問(wèn)題,而問(wèn)題再多,歸納一下,無(wú)外乎以下幾點(diǎn):

        1. API差異 :模型的實(shí)現(xiàn)方式如何遷移,不同框架之間的API有沒(méi)有差異?如何避免這些差異帶來(lái)的模型效果的差異?

        2. 模型文件差異 :訓(xùn)練好的模型文件如何遷移?轉(zhuǎn)換框架后如何保證精度的損失在可接受的范圍內(nèi)?

        3. 預(yù)測(cè)方式差異 :轉(zhuǎn)換后的模型如何預(yù)測(cè)?預(yù)測(cè)的效果與轉(zhuǎn)換前的模型差異如何?

        飛槳開(kāi)發(fā)了一個(gè)新的功能模塊,叫X2Paddle (Github見(jiàn)參考1),可以支持主流深度學(xué)習(xí)框架模型轉(zhuǎn)換至飛槳,包括Caffe、Tensorflow、onnx等模型直接轉(zhuǎn)換為Paddle Fluid可加載的預(yù)測(cè)模型,并且還提供了這三大主流框架間的API差異比較,方便我們?cè)谧约褐苯訌?fù)現(xiàn)模型時(shí)對(duì)比API之間的差異,深入理解API的實(shí)現(xiàn)方式從而降低模型遷移帶來(lái)的損失。

        下面以TensorFlow轉(zhuǎn)換成Paddle Fluid模型為例,詳細(xì)講講如何實(shí)現(xiàn)模型的遷移。

        TensorFlow-Fluid 的API差異

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        在深度學(xué)習(xí)入門過(guò)程中,大家常見(jiàn)的就是手寫數(shù)字識(shí)別這個(gè)demo,下面是一份最簡(jiǎn)單的實(shí)現(xiàn)手寫數(shù)字識(shí)別的代碼:

        大家看這段代碼里,第一步是導(dǎo)入mnist數(shù)據(jù)集,然后設(shè)置了一個(gè)占位符x來(lái)表示輸入的圖片數(shù)據(jù),再設(shè)置兩個(gè)變量w和b,分別表示權(quán)重和偏置來(lái)計(jì)算,最后通過(guò)softmax計(jì)算得到輸出的y值,而我們真實(shí)的label則是變量y_ 。

        前向傳播完成后,就可以計(jì)算預(yù)測(cè)值y與label y_之間的交叉熵。

        再選擇合適的優(yōu)化函數(shù),此處為梯度下降,最后啟動(dòng)一個(gè)Session,把數(shù)據(jù)按batch灌進(jìn)去,計(jì)算acc即可得到準(zhǔn)確率。

        這是一段非常簡(jiǎn)單的代碼,如果我們想把這段代碼變成飛槳的代碼,有人可能會(huì)認(rèn)為非常麻煩,每一個(gè)實(shí)現(xiàn)的API還要一一去找對(duì)應(yīng)的實(shí)現(xiàn)方式,但是這里,我可以告訴大家,不!用!這!么!麻!煩!因?yàn)樵?strong>X2Paddle 里有一份常用的Tensorflow對(duì)應(yīng)Fluid的API表,(https://github.com/PaddlePaddle/X2Paddle/tree/master/tensorflow2fluid/doc),如下所示:

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        對(duì)于常用的TensorFlow的API,都有相應(yīng)的飛槳接口,如果兩者的功能沒(méi)有差異,則會(huì)標(biāo)注功能一致,如果實(shí)現(xiàn)方式或者支持的功能、參數(shù)等有差異,即會(huì)標(biāo)注“差異對(duì)比”,并詳細(xì)注明。

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        譬如,在上文這份非常簡(jiǎn)單的代碼里,出現(xiàn)了這些TensorFlow的API:

        在出現(xiàn)的這些api里,大部分的功能都是一致的,只有兩個(gè)功能不同,分別是tf.placeholder和tf.nn.softmax_cross_entropy_with_logits ,分別對(duì)應(yīng) fluid.layers.data 和 fluid.layers.softmax_with_cross_entropy . 我們來(lái)看看具體差異:

        tf.placeholder V.S fluid.layers.data

        常用TensorFlow的同學(xué)對(duì)placeholder應(yīng)該不陌生,中文翻譯為占位符,什么意思呢?在TensorFlow 2.0以前,還是靜態(tài)圖的設(shè)計(jì)思想,整個(gè)設(shè)計(jì)理念是計(jì)算流圖,在編寫程序時(shí),首先構(gòu)筑整個(gè)系統(tǒng)的graph,代碼并不會(huì)直接生效,這一點(diǎn)和python的其他數(shù)值計(jì)算庫(kù)(如Numpy等)不同,graph為靜態(tài)的,在實(shí)際的運(yùn)行時(shí),啟動(dòng)一個(gè)session,程序才會(huì)真正的運(yùn)行。這樣做的好處就是:避免反復(fù)地切換底層程序?qū)嶋H運(yùn)行的上下文,tensorflow幫你優(yōu)化整個(gè)系統(tǒng)的代碼。我們知道,很多python程序的底層為C語(yǔ)言或者其他語(yǔ)言,執(zhí)行一行腳本,就要切換一次,是有成本的,tensorflow通過(guò)計(jì)算流圖的方式,可以幫你優(yōu)化整個(gè)session需要執(zhí)行的代碼。

        在代碼層面,每一個(gè)tensor值在graph上都是一個(gè)op,當(dāng)我們將train數(shù)據(jù)分成一個(gè)個(gè)minibatch然后傳入網(wǎng)絡(luò)進(jìn)行訓(xùn)練時(shí),每一個(gè)minibatch都將是一個(gè)op,這樣的話,一副graph上的op未免太多,也會(huì)產(chǎn)生巨大的開(kāi)銷;于是就有了tf.placeholder,我們每次可以將 一個(gè)minibatch傳入到x = tf.placeholder(tf.float32,[None,32])上,下一次傳入的x都替換掉上一次傳入的x,這樣就對(duì)于所有傳入的minibatch x就只會(huì)產(chǎn)生一個(gè)op,不會(huì)產(chǎn)生其他多余的op,進(jìn)而減少了graph的開(kāi)銷。

        參數(shù)對(duì)比

        tf.placeholder

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        paddle.fluid.layers.data

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        從圖中可以看到,飛槳的api參數(shù)更多,具體差異如下:

        · Batch維度處理

        TensorFlow: 對(duì)于shape中的batch維度,需要用戶使用None指定;

        飛槳: 將第1維設(shè)置為-1表示batch維度;如若第1維為正數(shù),則會(huì)默認(rèn)在最前面插入batch維度,如若要避免batch維,可將參數(shù)append_batch_size設(shè)為False。

        · 梯度是否回傳

        tensorflow和pytorch都支持對(duì)輸入求梯度,在飛槳中直接設(shè)置stop_gradient = False即可。如果在某一層使用stop_gradient=True,那么這一層之前的層都會(huì)自動(dòng)的stop_gradient=True,梯度不會(huì)參與回傳,可以對(duì)某些不需要參與loss計(jì)算的信息設(shè)置為stop_gradient=True。對(duì)于含有BatchNormalization層的CNN網(wǎng)絡(luò),也可以對(duì)輸入求梯度,如

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        tf.nn.softmax_cross_entropy_with_logits V.S

        fluid.layers.softmax_with_cross_entropy

        參數(shù)對(duì)比

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        paddle.fluid.layers.softmax_with_cross_entropy

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        功能差異

        標(biāo)簽類型

        TensorFlow:labels只能使用軟標(biāo)簽,其shape為[batch, num_classes],表示樣本在各個(gè)類別上的概率分布;

        飛槳:通過(guò)設(shè)置soft_label,可以選擇軟標(biāo)簽或者硬標(biāo)簽。當(dāng)使用硬標(biāo)簽時(shí),label的shape為[batch, 1],dtype為int64;當(dāng)使用軟標(biāo)簽時(shí),其shape為[batch, num_classes],dtype為int64。

        返回值

        TensorFlow:返回batch中各個(gè)樣本的log loss;

        飛槳:當(dāng)return_softmax為False時(shí),返回batch中各個(gè)樣本的log loss;當(dāng)return_softmax為True時(shí),再額外返回logtis的歸一化值。

        疑問(wèn)點(diǎn)?

        硬標(biāo)簽 ,即 one-hot label, 每個(gè)樣本僅可分到一個(gè)類別

        軟標(biāo)簽 ,每個(gè)樣本可能被分配至多個(gè)類別中

        numeric_stable_mode :這個(gè)參數(shù)是什么呢?標(biāo)志位,指明是否使用一個(gè)具有更佳數(shù)學(xué)穩(wěn)定性的算法。僅在 soft_label 為 False的GPU模式下生效. 若 soft_label 為 True 或者執(zhí)行場(chǎng)所為CPU, 算法一直具有數(shù)學(xué)穩(wěn)定性。注意使用穩(wěn)定算法時(shí)速度可能會(huì)變慢。默認(rèn)為 True。

        return_softmax : 指明是否額外返回一個(gè)softmax值, 同時(shí)返回交叉熵計(jì)算結(jié)果。默認(rèn)為False。

        如果 return_softmax 為 False, 則返回交叉熵?fù)p失

        如果 return_softmax 為 True,則返回元組 (loss, softmax) ,其中交叉熵?fù)p失為形為[N x 1]的二維張量,softmax為[N x K]的二維張量

        代碼示例

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        所以通過(guò)API對(duì)應(yīng)表,我們可以直接轉(zhuǎn)換把TensorFlow代碼轉(zhuǎn)換成Paddle Fluid代碼。但是如果現(xiàn)在項(xiàng)目已經(jīng)上線了,代碼幾千行甚至上萬(wàn)行,或者已經(jīng)訓(xùn)練出可預(yù)測(cè)的模型了,如果想要直接轉(zhuǎn)換API是一件非常耗時(shí)耗精力的事情,有沒(méi)有一種方法可以直接把訓(xùn)練好的可預(yù)測(cè)模型直接轉(zhuǎn)換成另一種框架寫的,只要轉(zhuǎn)換后的損失精度在可接受的范圍內(nèi),就可以直接替換。下面就講講訓(xùn)練好的模型如何遷移。

        模型遷移

        VGG_16是CV領(lǐng)域的一個(gè)經(jīng)典模型,我以tensorflow/models下的VGG_16為例,給大家展示如何將TensorFlow訓(xùn)練好的模型轉(zhuǎn)換為飛槳模型。

        下載預(yù)訓(xùn)練模型

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        解壓下載的壓縮文件

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        保存模型為checkpoint格式

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        TensorFlow2fluid目前支持checkpoint格式的模型或者是將網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)序列化的pb格式模型,上面下載的vgg_16.ckpt僅僅存儲(chǔ)了模型參數(shù),因此我們需要重新加載參數(shù),并將網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)一起保存為checkpoint模型

        將模型轉(zhuǎn)換為飛槳模型

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        注意:部分OP在轉(zhuǎn)換時(shí),需要將參數(shù)寫入文件;或者是運(yùn)行tensorflow模型進(jìn)行infer,獲取tensor值。兩種情況下均會(huì)消耗一定的時(shí)間用于IO或計(jì)算,對(duì)于后一種情況,

        打印輸出log信息(截取部分)

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        到這一步,我們已經(jīng)把tensorflow/models下的vgg16模型轉(zhuǎn)換成了Paddle Fluid 模型,轉(zhuǎn)換后的模型與原模型的精度有損失嗎?如何預(yù)測(cè)呢?來(lái)看下面。

        預(yù)測(cè)結(jié)果差異

        加載轉(zhuǎn)換后的飛槳模型,并進(jìn)行預(yù)測(cè)

        上一步轉(zhuǎn)換后的模型目錄命名為“paddle_model”,在這里我們通過(guò)ml.ModelLoader把模型加載進(jìn)來(lái),注意轉(zhuǎn)換后的飛槳模型的輸出格式由NHWC轉(zhuǎn)換為NCHW,所以我們需要對(duì)輸入數(shù)據(jù)做一個(gè)轉(zhuǎn)置。處理好數(shù)據(jù)后,即可通過(guò)model.inference來(lái)進(jìn)行預(yù)測(cè)了。具體代碼如下:

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        對(duì)比模型損失

        轉(zhuǎn)換模型有一個(gè)問(wèn)題始終避免不了,就是損失,從Tesorflow的模型轉(zhuǎn)換為Paddle Fluid模型,如果模型的精度損失過(guò)大,那么轉(zhuǎn)換模型實(shí)際上是沒(méi)有意義的,只有損失的精度在我們可接受的范圍內(nèi),模型轉(zhuǎn)換才能被實(shí)際應(yīng)用。在這里可以通過(guò)把兩個(gè)模型文件加載進(jìn)來(lái)后,通過(guò)numpy.fabs來(lái)求兩個(gè)模型結(jié)果的差異。

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        打印輸出

      飛槳上線萬(wàn)能轉(zhuǎn)換小工具,教你玩轉(zhuǎn)TensorFlow、Caffe等模型遷移

        需要注意的點(diǎn)

        1. 轉(zhuǎn)換后的模型需要注意輸入格式,飛槳中輸入格式需為NCHW格式。

        此例中不涉及到輸入中間層,如卷積層的輸出,需要了解的是飛槳中的卷積層輸出,卷積核的shape與TensorFlow有差異。

        2. 模型轉(zhuǎn)換完后,檢查轉(zhuǎn)換前后模型的diff,需要測(cè)試得到的最大diff是否滿足轉(zhuǎn)換需求。

         

         

        總結(jié)

        X2Paddle提供了一個(gè)非常方便的轉(zhuǎn)換方式,讓大家可以直接將訓(xùn)練好的模型轉(zhuǎn)換成Paddle Fluid版本。

        轉(zhuǎn)換模型原先需要直接通過(guò)API對(duì)照表來(lái)重新實(shí)現(xiàn)代碼。但是在實(shí)際生產(chǎn)過(guò)程中這么操作是很麻煩的,甚至還要進(jìn)行二次開(kāi)發(fā)。

        如果有新的框架能輕松轉(zhuǎn)換模型,迅速運(yùn)行調(diào)試,迭代出結(jié)果,何樂(lè)而不為呢?

        雖然飛槳相比其他AI平臺(tái)上線較晚,但是憑借X2Paddle小工具,能快速將AI開(kāi)發(fā)者吸引到自己的平臺(tái)上來(lái),后續(xù)的優(yōu)勢(shì)將愈加明顯。

        除了本文提到的tensoflow2fluid,Paddle Fluid還支持caffe2fluid、onnx2fluid,大家可以根據(jù)自身的需求體驗(yàn)一下,有問(wèn)題可以留言交流~

        參考資料:

        1. X2Paddle Github:https://github.com/PaddlePaddle/X2Paddle

        2. tensorflow2fluid: https://github.com/PaddlePaddle/X2Paddle/tree/master/tensorflow2fluid

      特別提醒:本網(wǎng)內(nèi)容轉(zhuǎn)載自其他媒體,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。本站不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。如若本網(wǎng)有任何內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系我們,本站將會(huì)在24小時(shí)內(nèi)處理完畢。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)