深度學習框架哪個最好用?TensorFlow還是PyTorch?

深度學習框架哪個最好用?TensorFlow還是PyTorch?

作為人工智能領域的一員,你認為神經網絡中最好用的框架是什麼?TensorFlow 還是 PyTorch ?下面這篇文章將會告訴你答案。

在這兩種環境下神經網絡的操作步驟在機器學習基本都是相似的:

  • 導入所需庫;
  • 加載和預處理數據;
  • 定義模型;
  • 定義優化器和損失函數;
  • 訓練模型;
  • 最後,評估模型。

這些步驟可以在兩個框架中非常相似地實現。為此,在本文中,我們將分別用PyTorch接口和Tensor Flow的Keras接口構建一個神經網絡模型,並對手寫數字進行分類。整個代碼可以在 GitHub 上測試,並作為 colab google notebook運行。

1. 編程神經網絡的步驟

A)導入所需庫

在這兩個框架中,我們都需要首先導入一些Python庫,並定義一些需要訓練的超參數:

<code>import numpy as np 
import matplotlib.pyplot as plt epochs = 10 
batch_size=64/<code>

對於 TensorFlow ,只需要這個庫:

<code>import tensorflow as tf/<code>

而在 PyTorch 的情況下,則需要這兩個:

<code>import torch 
import torchvision/<code>

B)加載和預處理數據

通過這兩行代碼,可以使用 TensorFlow 加載和準備數據:

<code>(x_trainTF_, y_trainTF_), _ = tf.keras.datasets.mnist.load_data() x_trainTF = x_trainTF_.reshape(60000, 784).astype('float32')/255 y_trainTF = tf.keras.utils.to_categorical(y_trainTF_, 
            num_classes=10)/<code>

而在PyTorch中則是:

<code>xy_trainPT = torchvision.datasets.MNIST(root='./data', train=True, download=True,transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor()])) xy_trainPT_loader = torch.utils.data.DataLoader(xy_trainPT, batch_size=batch_size)/<code>

我們可以用庫 matplotlib.pyplot驗證這兩個代碼是否加載了相同的數據:

<code>print("TensorFlow:")
fig = plt.figure(figsize=(25, 4))
for idx in np.arange(20):
   ax = fig.add_subplot(2, 20/2, idx+1, xticks=[], yticks=[])
   ax.imshow(x_trainTF_[idx], cmap=plt.cm.binary)
   ax.set_title(str(y_trainTF_[idx]))/<code>
深度學習框架哪個最好用?TensorFlow還是PyTorch?

<code>print("PyTorch:")
fig = plt.figure(figsize=(25, 4)) 
for idx in np.arange(20):
   ax = fig.add_subplot(2, 20/2, idx+1, xticks=[], yticks=[])
   ax.imshow(torch.squeeze(image, dim = 0).numpy(), 
             cmap=plt.cm.binary)
   image, label = xy_trainPT [idx]
   ax.set_title(str(label))/<code>
深度學習框架哪個最好用?TensorFlow還是PyTorch?

C)定義模型

為了定義模型,在這兩種情況下,都使用了相當相似的語法。在 TensorFlow 的情況下,可以使用以下代碼完成:

<code>modelTF = tf.keras.Sequential([ tf.keras.layers.Dense(10,activation='sigmoid',input_shape=(784,)), tf.keras.layers.Dense(10,activation='softmax') ])/<code>

在PyTorch可以用

<code>modelPT= torch.nn.Sequential( torch.nn.Linear(784,10),torch.nn.Sigmoid(), torch.nn.Linear(10,10), torch.nn.LogSoftmax(dim=1) )/<code>

D)定義優化器和損失函數

同樣,指定優化器和損失函數的方法是也差不多。使用 TensorFlow ,我們可以這樣做:

<code>modelTF.compile( 
               loss="categorical_crossentropy",     
               optimizer=tf.optimizers.SGD(lr=0.01), 
               metrics = ['accuracy'] 
               )/<code>

而 PyTorch 如下:

<code>criterion = torch.nn.NLLLoss() 
optimizer = torch.optim.SGD(modelPT.parameters(), lr=0.01)/<code>

E)訓練模型

訓練模型是兩個接口差距最大的部分。在 TensorFlow 的情況下,我們只能使用以下代碼行:

<code>_ = modelTF.fit(x_trainTF, y_trainTF, epochs=epochs, 
                batch_size=batch_size, verbose = 0)/<code>

在 PyTorch 中,我們需要更長的代碼:

<code>for e in range(epochs):
    for images, labels in xy_trainPT_loader:
        images = images.view(images.shape[0], -1)
        loss = criterion(modelPT(images), labels)
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()/<code>

在 PyTorch 中,沒有像在 Keras 或 Scikit-learn 中 fit ()那樣的“預製”數據模型調整函數,因此訓練循環必須由程序員指定。好吧,這裡有一個折衷方案,在簡單和實用之間,能夠做更多的量身定做的事情。

F)評估模型

當我們需要評估模型時,同樣的情況也會發生,而在 TensorFlow 中,你只需要用測試數據調用方法 evaluate ():

<code>_, (x_testTF, y_testTF)= tf.keras.datasets.mnist.load_data()
x_testTF = x_testTF.reshape(10000, 784).astype('float32')/255
y_testTF = tf.keras.utils.to_categorical(y_testTF, num_classes=10)

_ , test_accTF = modelTF.evaluate(x_testTF, y_testTF)
print('\nAccuracy del model amb TensorFlow =', test_accTF)TensorFlow model Accuracy = 0.8658999800682068/<code>

在 PyTorch 中,再次要求程序員指定評估循環:

<code>xy_testPT = torchvision.datasets.MNIST(root='./data', train=False, download=True, 
            transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor()]))

xy_test_loaderPT = torch.utils.data.DataLoader(xy_testPT)

correct_count, all_count = 0, 0
for images,labels in xy_test_loaderPT:
  for i in range(len(labels)):
    img = images[i].view(1, 784)

    logps = modelPT(img)
    ps = torch.exp(logps)
    probab = list(ps.detach().numpy()[0])
    pred_label = probab.index(max(probab))
    true_label = labels.numpy()[i]
    if(true_label == pred_label):
      correct_count += 1
    all_count += 1

print("\nAccuracy del model amb PyTorch =", (correct_count/all_count))TensorFlow model Accuracy = 0.8657/<code>

2.兩者殊途同歸!

好吧,如這個簡單的例子所示,在TensorFlow和Pythorch中創建神經網絡的方法其實並沒有什麼不同,只是在一些細節上,程序員必須實現訓練和評估循環,並且在不同的步驟中指定了一些超參數,如epoch或batch_size。

事實上,這兩個框架在過去兩年中一直在不斷地融合,相互學習並採用它們的最佳特性。例如,在不久前發佈的 TensorFlow 2.2的新版本中,訓練步驟可以等同於PyTorch ,現在程序員可以通過實現 traint_step ()來指定循環體的詳細內容。所以不要擔心選擇“錯誤”的框架,它們會收斂的!最重要的是要學習背後的深度學習概念,而你在其中一個框架中獲得的所有知識都將對你在另一個框架中有作用。

3.工作還是研究?

如果你想在神經網絡中將解決方案投入工作或進行研究,兩者存在不同之處。在這種情況下,選擇正確的接口十分重要。

TensorFlow 是一個非常強大和成熟的 Python庫,具有強大的可視化功能和各種選擇高性能的模型開發,它有可供生產和自動支持 web 和移動平臺的推出選項。

另一方面, PyTorch 仍然是一個年輕的框架,而且有一個非常活躍的社區,特別是在研究領域。如下圖片所示,Pythorch的興起和採用基於在主要會議主題(CVPR、ICRL、ICML、NIPS、ACL、ICCV等)上發表的研究論文的數量。

深度學習框架哪個最好用?TensorFlow還是PyTorch?

從2018年的數據可以看出, PyTorch 框架的使用相對於2019年是少數的,而2019年的使用是壓倒性的。

因此,如果你想創建與人工智能相關的產品, TensorFlow 是一個很好的選擇。如果你想做研究,我推薦 PyTorch 。

4. 如果不知道選哪個,請選擇 Keras

如果你不確定,那就從 TensorFlow 的 Keras API 開始吧。PyTorch 的 API 有更多的靈活性和控制,但很明顯 TensorFlow 的 Keras API 更容易上手。

順便說一句, Keras 計劃在2020年推出幾項新功能,這些產品符合“讓事情變得更容易”的標準。下面是最近添加的一些新特性:

層和預處理接口

到目前為止,我們已經用 NumPy 和 PIL ( Python 影像庫)編寫的輔助工具進行了預處理。這種外部預處理使得模型變得不那麼便攜,因為每次有人重用一個已經訓練過的模型時,他們都必須重放預處理器接口。因此,通過“預處理層”,預處理現在可以成為模型的一部分。這包括文本標準化、標記化、矢量化、圖像歸一化、數據增強等方面。也就是說,這將允許模型接受原始文本或原始圖像作為輸入。

Keras調參器

它是一個框架,允許你在 Keras 中找到最好的超參數模型。當你花了一些時間在深度學習中工作時,你會發現這解決了模型構建的一個代價高昂的問題,例如精煉超參數,使模型性能最佳。這是一項非常困難的任務。

AutoKeras

如果你的項目要求在幾行代碼中為數據找到一個好的 ML 模型,那麼你就能在可能的模型空間裡自動搜索最好的模型,並使用 Keras 調參器查找超參數。對於高級用戶來說, AutoKeras 還允許對搜索空間和進程的配置進行更高級別的控制。

Cloud Keras

Cloud Keras的願景是讓程序員更容易地在本地進行開發工作,然後將代碼存放到雲端,使其能夠在雲端以最佳和分佈式的方式執行此代碼,而不必擔心集群或Docker參數。

與TensorFlow集成

為了更好地與 TFX ( TensorFlow Extended ,一個管理 ML 生產應用程序的平臺)集成,以及更好地支持將模型導出到 TF Lite (移動和嵌入式設備的 ML 執行引擎)。毫無疑問,提高對模型生產的支持對於 Keras 忠實粉絲來說是至關重要的。

5.總結

你認為哪種語言是開始編程的最佳語言, C ++還是 Java ?這取決於我們想用它做什麼,最重要的是,我們可以使用什麼工具來學習。在這方面我們可能永遠無法達成一致,因為每個人都有一個先入為主的觀點,我們很難改變我們彼此對這個問題的答案。但我們肯定都同意,我們的目的就是要知道如何編程。事實上,無論我們從一種語言的編程中學到什麼,當我們使用另一種語言時,它都會為我們服務,對吧?同樣的事情發生在這裡的框架,重要的是瞭解深度學習,而不是關於一個框架的語法細節,然後我們將使用這個知識的框架是在節省我們的訪問時間。

這篇文章的代碼可以從 GitHub 上下載:https://github.com/jorditorresBCN/PyTorch-vs-TensorFlow/blob/master/MNIST-with-PyTorch-and-TensorFlow.ipynb


--END--

學習更多人工智能知識,歡迎關注我們的公眾號:為AI吶喊(weainahan)


分享到:


相關文章: