天天看點

深度學習架構Keras與Pytorch對比

來源:磐創AI
深度學習架構Keras與Pytorch對比

譯者 | VK

來源 | towardsdatascience

【導讀】:本篇文章為大家介紹了深度學習架構Keras與Pytorch對比,希望對大家有所幫助。

對于許多科學家、工程師和開發人員來說,TensorFlow是他們的第一個深度學習架構。TensorFlow 1.0于2017年2月釋出,可以說,它對使用者不太友好。

在過去的幾年裡,兩個主要的深度學習庫Keras和Pytorch獲得了大量關注,主要是因為它們的使用比較簡單。

本文将介紹Keras與Pytorch的4個不同點以及為什麼選擇其中一個庫的原因。

Keras

Keras本身并不是一個架構,而是一個位于其他深度學習架構之上的進階API。目前它支援TensorFlow、Theano和CNTK。

Keras的優點在于它的易用性。這是迄今為止最容易上手并快速運作的架構。定義神經網絡是非常直覺的,因為使用API可以将層定義為函數。

Pytorch

Pytorch是一個深度學習架構(類似于TensorFlow),由Facebook的人工智能研究小組開發。與Keras一樣,它也抽象出了深層網絡程式設計的許多混亂部分。

就進階和低級代碼風格而言,Pytorch介于Keras和TensorFlow之間。比起Keras具有更大的靈活性和控制能力,但同時又不必進行任何複雜的聲明式程式設計(declarative programming)。

深度學習的從業人員整天都在糾結應該使用哪個架構。一般來說,這取決于個人喜好。但是在選擇Keras和Pytorch時,你應該記住它們的幾個方面。

深度學習架構Keras與Pytorch對比

(1)定義模型的類與函數

為了定義深度學習模型,Keras提供了函數式API。使用函數式API,神經網絡被定義為一系列順序化的函數,一個接一個地被應用。例如,函數定義層1( function defining layer 1)的輸出是函數定義層2的輸入。

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中,你将網絡設定為一個繼承來自Torch庫的torch.nn.Module的類。與Keras類似,Pytorch提供給你将層作為建構塊的能力,但是由于它們在Python類中,是以它們在類的init_()方法中被引用,并由類的forward()方法執行。

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 x
model = Net()
           

(2)張量和計算圖模型與标準數組的比較

Keras API向普通程式員隐藏了許多混亂的細節。這使得定義網絡層是直覺的,并且預設的設定通常足以讓你入門。

隻有當你正在實作一個相當先進或“奇特”的模型時,你才真正需要深入了解底層,了解一些基本的TensorFlow。

棘手的部分是,當你真正深入到較低級别的TensorFlow代碼時,所有的挑戰就随之而來!你需要確定所有的矩陣乘法都對齊。不要試着想列印出你自己定義的層的輸出,因為你隻會得到一個列印在你的終端上的沒有錯誤的張量定義。

Pytorch在這些方面更寬容一些。你需要知道每個層的輸入和輸出大小,但是這是一個比較容易的方面,你可以很快掌握它。你不需要建構一個抽象的計算圖,避免了在實際調試時無法看到該抽象的計算圖的細節。

Pytorch的另一個優點是平滑性,你可以在Torch張量和Numpy數組之間來回切換。如果你需要實作一些自定義的東西,那麼在TF張量和Numpy數組之間來回切換可能會很麻煩,這要求開發人員對TensorFlow會話有一個較好的了解。

Pytorch的互操作實際上要簡單得多。你隻需要知道兩種操作:一種是将Torch張量(一個可變對象)轉換為Numpy,另一種是反向操作。

當然,如果你從來不需要實作任何奇特的東西,那麼Keras就會做得很好,因為你不會遇到任何TensorFlow的障礙。但是如果你有這個需求,那麼Pytorch将會是一個更加好的選擇。

(3)訓練模型

深度學習架構Keras與Pytorch對比

用Keras訓練模特超級簡單!隻需一個簡單的.fit(),你就可以直接去跑步了。

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

在Pytorch中訓練模型包括以下幾個步驟:

  1. 在每批訓練開始時初始化梯度
  2. 前向傳播
  3. 反向傳播
  4. 計算損失并更新權重
# 在資料集上循環多次
for epoch in range(2):  
    for i, data in enumerate(trainloader, 0):
        # 擷取輸入; data是清單[inputs, labels]
        inputs, labels = data 
        # (1) 初始化梯度
        optimizer.zero_grad() 

        # (2) 前向傳播
        outputs = net(inputs)
        loss = criterion(outputs, labels)

        # (3) 反向傳播
        loss.backward()
        # (4) 計算損失并更新權重
        optimizer.step()
           

光是訓練就需要很多步驟!

我想這種方式你就會知道實際上發生了什麼。由于這些模型訓練步驟對于訓練不同的模型本質上保持不變,是以這些代碼實際上完全不必要的。

(4)控制CPU與GPU模式的比較

深度學習架構Keras與Pytorch對比

如果你已經安裝了tensorflow-gpu,那麼在Keras中使用GPU是預設啟用和完成的。如果希望将某些操作轉移到CPU,可以使用以下代碼。

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

對于Pytorch,你必須顯式地為每個torch張量和numpy變量啟用GPU。這将使代碼變得混亂,如果你在CPU和GPU之間來回移動以執行不同的操作,則很容易出錯。

例如,為了将我們之前的模型轉移到GPU上運作,我們需要做以下工作:

#擷取GPU裝置
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

#傳送網絡到GPU
net.to(device)

# 傳送輸入和标簽到GPU
inputs, labels = data[0].to(device), data[1].to(device)
           

Keras在這方面的優勢在于它的簡單性和良好的預設設定

選擇架構的一般建議

我通常給出的建議是從Keras開始。

Keras絕對是最容易使用、了解和快速上手并運作的架構。你不需要擔心GPU設定,處理抽象代碼,或者做任何複雜的事情。你甚至可以在不接觸TensorFlow的任何一行的情況下實作定制層和損失函數。

如果你确實開始深入到深度網絡的更細粒度方面,或者正在實作一些非标準的東西,那麼Pytorch就是你的首選庫。在Keras上實作反而會有一些額外的工作量,雖然不多,但這會拖慢你的進度。使用pytorch能夠快速地實作、訓練和測試你的網絡,并附帶易于調試的額外好處!

-------- End --------

深度學習架構Keras與Pytorch對比

精選資料

回複關鍵詞,擷取對應的資料:

關鍵詞 資料名稱
600 《Python知識手冊》
md 《Markdown速查表》
time 《Python時間使用指南》
str 《Python字元串速查表》
pip 《Python:Pip速查表》
style 《Pandas表格樣式配置指南》
mat 《Matplotlib入門100個案例》
px 《Plotly Express可視化指南》

精選視訊

可視化: Plotly

财經: Plotly在投資領域的應用 | 繪制K線圖表

排序算法: 冒泡排序 | 選擇排序 | 快速排序 | 歸并排序 | 堆排序 | 插入排序 | 希爾排序 | 計數排序

深度學習架構Keras與Pytorch對比

繼續閱讀