來源:磐創AI
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iZjRjNlV2M3EmM4cTOkNTZ2ATZ0EDZiJzNxMWMiRjM08CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
譯者 | 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時,你應該記住它們的幾個方面。
(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訓練模特超級簡單!隻需一個簡單的.fit(),你就可以直接去跑步了。
history = model.fit_generator(
generator=train_generator,
epochs=10,
validation_data=validation_generator)
在Pytorch中訓練模型包括以下幾個步驟:
- 在每批訓練開始時初始化梯度
- 前向傳播
- 反向傳播
- 計算損失并更新權重
# 在資料集上循環多次
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模式的比較
如果你已經安裝了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 --------
精選資料
回複關鍵詞,擷取對應的資料:
關鍵詞 | 資料名稱 |
---|---|
600 | 《Python知識手冊》 |
md | 《Markdown速查表》 |
time | 《Python時間使用指南》 |
str | 《Python字元串速查表》 |
pip | 《Python:Pip速查表》 |
style | 《Pandas表格樣式配置指南》 |
mat | 《Matplotlib入門100個案例》 |
px | 《Plotly Express可視化指南》 |
精選視訊
可視化: Plotly
财經: Plotly在投資領域的應用 | 繪制K線圖表
排序算法: 冒泡排序 | 選擇排序 | 快速排序 | 歸并排序 | 堆排序 | 插入排序 | 希爾排序 | 計數排序