'深度學習框架Keras與Pytorch對比'

人工智能 程序員 Python Facebook 工程師 人工智能遇見磐創 2019-09-05
"
"
深度學習框架Keras與Pytorch對比

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

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

本文將介紹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對比

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

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

本文將介紹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對比

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

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

本文將介紹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是他們的第一個深度學習框架。TensorFlow 1.0於2017年2月發佈,可以說,它對用戶不太友好。

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

本文將介紹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能夠快速地實現、訓練和測試你的網絡,並附帶易於調試的額外好處!

"

相關推薦

推薦中...