0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

對比Keras和PyTorch四個(gè)方面的不同

DPVg_AI_era ? 來源:lq ? 2019-06-29 09:20 ? 次閱讀

Keras和PyTorch變得極為流行,主要原因是它們比TensorFlow更容易使用。本文對比了Keras和PyTorch四個(gè)方面的不同,讀者可以針對自己的任務(wù)來選擇。

對于許多科學(xué)家、工程師和開發(fā)人員來說,TensorFlow是他們的第一個(gè)深度學(xué)習(xí)框架。但indus.ai公司機(jī)器學(xué)習(xí)工程師George Seif認(rèn)為,TF并不是非常的用戶友好。

相比TF,Seif認(rèn)為Keras和PyTorch比TensorFlow更易用,已經(jīng)獲得了巨大的普及。

Keras本身不是框架,而是一個(gè)位于其他Deep Learning框架之上的高級API。目前它支持TensorFlow,Theano和CNTK。Keras是迄今為止啟動(dòng)和運(yùn)行最快最簡單的框架。定義神經(jīng)網(wǎng)絡(luò)是直觀的,使用功能性API允許人們將層定義為函數(shù)。

而PyTorch像Keras一樣,它也抽象了深度網(wǎng)絡(luò)編程的大部分混亂部分。PyTorch介于Keras和TensorFlow之間,比Keras擁有更靈活、更好的控制力,與此同時(shí)用戶又不必做任何瘋狂的聲明式編程。

深度學(xué)習(xí)練習(xí)者整天都在爭論應(yīng)該使用哪個(gè)框架。接下來我們將通過4個(gè)不同方面,來對比Keras和PyTorch,最終初學(xué)者會(huì)明白應(yīng)該選誰。

用于定義模型的類與函數(shù)

Keras提供功能性API來定義深度學(xué)習(xí)模型。神經(jīng)網(wǎng)絡(luò)被定義為一組順序函數(shù),功能定義層1的輸出是功能定義層2的輸入,例如下面demo代碼:

img_input = layers.Input(shape=input_shape)x = layers.Conv2D(64, (3, 3), activation='relu')(img_input)x = layers.Conv2D(64, (3, 3), activation='relu')(x)x = layers.MaxPooling2D((2, 2), strides=(2, 2))(x)

而PyTorch將網(wǎng)絡(luò)設(shè)置為一個(gè)類,擴(kuò)展了Torch庫中的torch.nn.Module,PyTorch允許用戶訪問所有Python的類功能而不是簡單的函數(shù)調(diào)用。與Keras類似,PyTorch提供了層作為構(gòu)建塊,但由于它們位于Python類中,因此它們在類的__init __()方法中引用,并由類的forward()方法執(zhí)行。例如下面demo代碼:

class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, 3) self.conv2 = nn.Conv2d(64, 64, 3) self.pool = nn.MaxPool2d(2, 2) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool(F.relu(self.conv2(x))) return xmodel = Net()

所以如果你想更清晰、更優(yōu)雅地定義網(wǎng)絡(luò),可以選擇PyTorch;如果只是求快好上手,可以選擇Keras。

張量、計(jì)算圖與標(biāo)準(zhǔn)陣列

Keras API隱藏了編碼器的許多混亂細(xì)節(jié)。定義網(wǎng)絡(luò)層非常直觀,默認(rèn)設(shè)置已經(jīng)足以應(yīng)付大部分情況,不需要涉及到非常底層的內(nèi)容。

而當(dāng)你真正觸達(dá)到更底層的TensorFlow代碼時(shí),同時(shí)你也獲得了隨之而來的最具有挑戰(zhàn)性的部分:你需要確保所有矩陣乘法都排成一行。哦對了,甚至別指望打印出圖層的一個(gè)輸出,因?yàn)槟阒粫?huì)在終端上打印出一個(gè)漂亮的Tensor定義。

相比起來,PyTorch在這些方面就做的更讓人欣慰一些。你需要知道每個(gè)層的輸入和輸出大小,但這很快就能掌握。同時(shí)你也不必處理構(gòu)建一個(gè)無法在調(diào)試中看到的抽象計(jì)算圖。

PyTorch的另一個(gè)優(yōu)勢是可以在Torch Tensors和Numpy陣列之間來回切換。而反觀TF,如果需要實(shí)現(xiàn)自定義的東西,在TF張量和Numpy陣列之間來回轉(zhuǎn)換可能會(huì)很麻煩,需要開發(fā)人員對TensorFlow會(huì)話有充分的了解。

PyTorch上這種操作實(shí)際上要簡單得多。你只需要知道兩個(gè)操作:一個(gè)將Torch Tensor(一個(gè)Variable對象)切換到Numpy,另一個(gè)反過來。

當(dāng)然,如果不需要實(shí)現(xiàn)任何花哨的東西,那么Keras會(huì)做得很好,因?yàn)槟悴粫?huì)遇到任何TensorFlow路障。

訓(xùn)練模型

在Keras上訓(xùn)練模型非常容易!一個(gè)簡單的.fit()走四方。下面是demo代碼:

history = model.fit_generator( generator=train_generator, epochs=10, validation_data=validation_generator)

但在PyTorch中訓(xùn)練模型就費(fèi)點(diǎn)事了,包括幾個(gè)步驟:

在每批訓(xùn)練開始時(shí)初始化梯度

運(yùn)行正向傳遞模式

運(yùn)行向后傳遞

計(jì)算損失并更新權(quán)重

for epoch in range(2): # loop over the dataset multiple times running_loss = 0.0 for i, data in enumerate(trainloader, 0): # Get the inputs; data is a list of [inputs, labels] inputs, labels = data # (1) Initialise gradients optimizer.zero_grad() # (2) Forward pass outputs = net(inputs) loss = criterion(outputs, labels) # (3) Backward loss.backward() # (4) Compute the loss and update the weights optimizer.step()

你看看,就運(yùn)行個(gè)訓(xùn)練就得這么多步驟!

我想這樣你總能意識(shí)到發(fā)生了什么。同時(shí),由于這些模型訓(xùn)練步驟在訓(xùn)練不同模型時(shí)基本保持不變,因此非常不必要。

控制CPUGPU模式

如果安裝了tensorflow-gpu,默認(rèn)情況下在Keras中啟用并完成使用GPU。然后,如果希望將某些操作移動(dòng)到CPU,則可以使用單行操作。

with tf.device('/cpu:0'): y = apply_non_max_suppression(x)

在PyTorch就得費(fèi)點(diǎn)勁,你必須為每個(gè)Torch張量和numpy變量明確啟用GPU。如果在CPU和GPU之間來回切換以進(jìn)行不同的操作,就會(huì)使代碼變得混亂并且容易出錯(cuò)。

例如,要將我們以前的模型轉(zhuǎn)移到GPU上運(yùn)行,我們必須執(zhí)行以下操作:

# Get the GPU devicedevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# Transfer the network to GPUnet.to(device)# Transfer the inputs and labels to GPUinputs, labels = data[0].to(device), data[1].to(device)

在GPU這塊,Keras憑借其簡潔和漂亮的默認(rèn)設(shè)置贏得了勝利。

選擇框架的建議

Seif通常給出的建議是從Keras開始,畢竟又快、又簡單、又好用!你甚至可以執(zhí)行自定義圖層和損失函數(shù)的操作,而無需觸及任何一行TensorFlow。

但如果你確實(shí)開始深入了解深層網(wǎng)絡(luò)中更細(xì)粒度的方面,或者正在實(shí)現(xiàn)非標(biāo)準(zhǔn)的東西,那么PyTorch就是首選庫。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5472

    瀏覽量

    120909
  • keras
    +關(guān)注

    關(guān)注

    2

    文章

    20

    瀏覽量

    6077
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    802

    瀏覽量

    13121

原文標(biāo)題:深度學(xué)習(xí)框架如何選?4大場景對比Keras和PyTorch

文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    esd,mcu和adc復(fù)位問題的必須要注意的四個(gè)方面!

    esd,mcu和adc復(fù)位問題的必須要注意的四個(gè)方面https://bbs.elecfans.com/jishu_1450674_1_1.html
    發(fā)表于 11-28 16:58

    印制電路板設(shè)計(jì)四個(gè)方面的要求

      對于印制電路板的設(shè)計(jì)要求,通常要從正確性、可靠性、工藝性、經(jīng)濟(jì)性四個(gè)方面進(jìn)行考慮。制板要求不同,加工復(fù)雜程度也就不同。因此,要根據(jù)產(chǎn)品的性質(zhì)、所處的階段(研制、試制、生產(chǎn)),相應(yīng)地制定印制電路板的設(shè)計(jì)要求。
    發(fā)表于 09-04 16:11

    S32G-GoldVip上的Pytorch和Tensorflow如何啟用?

    大家好,我想在 Goldbox 上運(yùn)行我的 ML 模型,我看到 Goldvip 有一個(gè)可用的庫 eIQ Auto,它提供內(nèi)部使用 Tensorflow 的 Pytorch/Keras 2.x,請幫助我了解這些庫在哪里可用以及如何
    發(fā)表于 03-30 07:05

    TCO在CRT方面的對比

    TCO在CRT方面的對比 隨著時(shí)間的發(fā)展,原有的TCO99標(biāo)準(zhǔn)已經(jīng)難以適應(yīng)新的LCD、PDP等采用新式顯示技術(shù)的顯示器。于是TCO聯(lián)盟開始制定最新的TCO03標(biāo)準(zhǔn),
    發(fā)表于 12-26 17:06 ?831次閱讀

    TCO在LCD方面的對比

    TCO在LCD方面的對比 隨著時(shí)間的發(fā)展,原有的TCO99標(biāo)準(zhǔn)已經(jīng)難以適應(yīng)新的LCD、PDP等采用新式顯示技術(shù)的顯示器。于是TCO聯(lián)盟開始制定最新的TCO03標(biāo)準(zhǔn),
    發(fā)表于 12-26 17:10 ?875次閱讀

    總結(jié)了區(qū)塊鏈技術(shù)的四個(gè)方面來了解區(qū)塊鏈

    是的,區(qū)塊鏈?zhǔn)钦?jīng)技術(shù),對于這個(gè)技術(shù),頗多贊美之詞。但是,在贊美之余,我還是想潑幾杯冷水。區(qū)塊鏈很美,但也有美中不足之處,我大致總結(jié)了四個(gè)方面
    的頭像 發(fā)表于 01-22 15:48 ?6099次閱讀

    2018年智能鎖行業(yè)的問題大致總結(jié)為以下四個(gè)方面

    最近,對智能鎖行業(yè)進(jìn)行了年終調(diào)研,根據(jù)企業(yè)的反應(yīng),智能鎖行業(yè)的問題大致總結(jié)為以下四個(gè)方面
    發(fā)表于 01-02 10:07 ?1082次閱讀

    高頻PCB設(shè)計(jì)中,工程師需考慮四個(gè)方面帶來的干擾問題并給解決方案

    在高頻PCB設(shè)計(jì)中,工程師需要考慮電源噪聲、傳輸線干擾、耦合、電磁干擾(EMI)四個(gè)方面的干擾問題。接下來,我們結(jié)合工作中的實(shí)踐,給出有效的解決方案。
    的頭像 發(fā)表于 07-18 08:55 ?3548次閱讀

    四個(gè)方面解讀PCB射頻電路基礎(chǔ)特性及重要因素

    此處將從射頻界面、小的期望信號(hào)、大的干擾信號(hào)、相鄰頻道的干擾四個(gè)方面解讀射頻電路大基礎(chǔ)特性,并給出了在 PCB 設(shè)計(jì)過程中需要特別注意的重要因素。
    發(fā)表于 08-07 14:42 ?920次閱讀

    無錫市集成電路產(chǎn)業(yè)四個(gè)方面的特點(diǎn)

    半導(dǎo)體行業(yè)協(xié)會(huì)常務(wù)副理事長于燮康用“乘風(fēng)破浪”來概括無錫市集成電路產(chǎn)業(yè)發(fā)展所取得的成績。 于燮康總結(jié)了無錫市集成電路產(chǎn)業(yè)四個(gè)方面的特點(diǎn)。 ? 一是,產(chǎn)業(yè)規(guī)模實(shí)力厚實(shí),處于國內(nèi)“第一軍團(tuán)”。無錫市集成電路產(chǎn)業(yè)起步于二十世紀(jì)八十年代,
    的頭像 發(fā)表于 02-05 15:59 ?1.1w次閱讀

    四個(gè)方面區(qū)分MPK和CBB電容資料下載

    電子發(fā)燒友網(wǎng)為你提供四個(gè)方面區(qū)分MPK和CBB電容資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 03-27 08:44 ?23次下載
    <b class='flag-5'>四個(gè)</b><b class='flag-5'>方面</b>區(qū)分MPK和CBB電容資料下載

    四個(gè)方面看SoC 設(shè)計(jì)資料下載

    電子發(fā)燒友網(wǎng)為你提供四個(gè)方面看SoC 設(shè)計(jì)資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-27 08:43 ?8次下載
    <b class='flag-5'>四個(gè)</b><b class='flag-5'>方面</b>看SoC 設(shè)計(jì)資料下載

    物聯(lián)網(wǎng)技術(shù)在四個(gè)方面的應(yīng)用趨勢分析

      iGS320基于超低功耗 u-blox M10 標(biāo)準(zhǔn)精密 GNSS 平臺(tái),通過同時(shí)跟蹤多達(dá)四個(gè) GNSS 星座的衛(wèi)星,提供最大覆蓋范圍和可靠的定位精度。
    的頭像 發(fā)表于 05-30 16:52 ?1325次閱讀

    示波器經(jīng)常說“四個(gè)部分”是哪四個(gè)部分?

    在學(xué)習(xí)使用示波器之前,了解示波器的結(jié)構(gòu)很重要,畢竟知己知彼,方能百戰(zhàn)百勝嘛!安泰維修記得在很早之前就聽過很多“你要先去了解示波器的四個(gè)部分”、“在學(xué)習(xí)之前你要先弄懂示波器那四個(gè)部分再去學(xué)……”等
    的頭像 發(fā)表于 10-19 17:03 ?1794次閱讀
    示波器經(jīng)常說“<b class='flag-5'>四個(gè)</b>部分”是哪<b class='flag-5'>四個(gè)</b>部分?

    提升駕駛體驗(yàn)的四個(gè)技術(shù)趨勢

    提升駕駛體驗(yàn)的四個(gè)技術(shù)趨勢
    發(fā)表于 11-01 08:27 ?0次下載
    提升駕駛體驗(yàn)的<b class='flag-5'>四個(gè)</b>技術(shù)趨勢