TensorFlow 還是 PyTorch?哪一個才更適合編寫深度神經網絡?

TensorFlow 還是 PyTorch?哪一個才更適合編寫深度神經網絡?

作者 | Jordi TORRES.AI

deephub翻譯組 | Alexander Zhao

來源 | DeepHub IMBA(ID:deephub-imba)

編程實現神經網絡的最佳框架是什麼?TensorFlow還是PyTorch?我的回答是:別擔心,你從哪一個入門,你選擇哪一個並不重要,重要的是自己動手實踐!下面我們開始吧!

這兩種框架都提供了編程神經網絡常用的機器學習步驟:

  • 導入所需的庫

  • 加載並預處理數據

  • 定義模型

  • 定義優化器和損失函數

  • 訓練模型

  • 評估模型

這些步驟可以在任何一個框架中找到非常類似的實現(即使是像MindSpore這樣的框架)。為此,在本文中,我們將構建一個神經網絡模型,分別在PyTorch API與TensorFlow Keras API下進行手寫數字分類任務的實現。

TensorFlow 還是 PyTorch?哪一個才更適合編寫深度神經網絡?

神經網絡編程步驟

a)導入必要的庫

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

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

對於TensorFlow,您僅需要額外導入以下庫:

<code> import tensorflow as tf/<code>
而對於PyTorch,您還需要導入這兩個庫:
<code> import torch /<code><code> import torchvision/<code>

b)導入並預處理數據

使用TensorFlow加載和準備數據可以使用以下兩行代碼:

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

而在PyTorch則是這兩行代碼:

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

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

 
<code>print("TensorFlow:")/<code><code> fig = plt.figure(figsize=(25, 4))/<code><code> for idx in np.arange(20):/<code><code> ax = fig.add_subplot(2, 20/2, idx+1, xticks=[], yticks=[])/<code><code> ax.imshow(x_trainTF_[idx], cmap=plt.cm.binary)/<code><code> ax.set_title(str(y_trainTF_[idx]))/<code>
<code>print("PyTorch:")/<code><code> fig = plt.figure(figsize=(25, 4))/<code><code> for idx in np.arange(20):/<code><code> ax = fig.add_subplot(2, 20/2, idx+1, xticks=[], yticks=[])/<code><code> ax.imshow(torch.squeeze(image, dim = 0).numpy,/<code><code> cmap=plt.cm.binary)/<code><code> image, label = xy_trainPT [idx]/<code><code> ax.set_title(str(label))/<code>

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)定義優化器與損失函數

同樣,指定優化器和loss函數的方法在兩個框架下也是很相似的。在TensorFlow下,我們可以這樣做:

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

在PyTorch下則是這樣的:

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

e)訓練模型

最大的不同在於訓練。對於TensorFlow,我們只需要這一行代碼:

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

而在PyTorch下則更長,像這樣:

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

PyTorch沒有內置像在Keras或Scikit-learn中非常常見的fit等訓練方法,因此訓練循環必須由程序員手動指定。嗯,這其實是在簡單性和實用性之間進行一定的折衷,以便能夠做更多自定義的事情。

f)評估模型

評估模型也是如此,在TensorFlow中,您只需對測試數據調用evaluate方法:

<code> _, (x_testTF, y_testTF)= tf.keras.datasets.mnist.load_data/<code><code> x_testTF = x_testTF.reshape(10000, 784).astype('float32')/255/<code><code> y_testTF = tf.keras.utils.to_categorical(y_testTF, num_classes=10)/<code><code> _ , test_accTF = modelTF.evaluate(x_testTF, y_testTF)/<code><code> print('\nAccuracy del model amb TensorFlow =', test_accTF)/<code><code> TensorFlow model Accuracy = 0.8658999800682068/<code>

在PyTorch中,再次需要程序員手動定義評估循環:

<code> xy_testPT = torchvision.datasets.MNIST(root='./data', train=False, download=True,/<code><code> transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor()]))/<code><code> xy_test_loaderPT = torch.utils.data.DataLoader(xy_testPT)/<code><code> correct_count, all_count = 0, 0/<code><code> for images,labels in xy_test_loaderPT:/<code><code> for i in range(len(labels)):/<code><code> img = images[i].view(1, 784)/<code><code> logps = modelPT(img)/<code><code> ps = torch.exp(logps)/<code><code> probab = list(ps.detach.numpy[0])/<code><code> pred_label = probab.index(max(probab))/<code><code> true_label = labels.numpy[i]/<code><code> if(true_label == pred_label):/<code><code> correct_count += 1/<code><code> all_count += 1/<code><code> print("\nAccuracy del model amb PyTorch =", (correct_count/all_count))/<code><code> TensorFlow model Accuracy = 0.8657/<code>

TensorFlow 還是 PyTorch?哪一個才更適合編寫深度神經網絡?

更重要的是,它們在相互融合!

好了,如這個簡單的示例所示,在TensorFlow和PyTorch中創建神經網絡的方式並沒有真正的區別,只是在一些細節方面,程序員必須實現訓練和評估循環的方式,以及一些超參數,像epoch或batch_size是在不同的步驟中指定的。

實際上,在過去兩年中,這兩個框架一直在不斷融合,相互學習並採用它們的長處。例如,在幾周前發佈的新版本TensorFlow 2.2中,訓練步驟可以像PyTorch一樣,現在程序員可以通過實現train_step來指定循環主體的詳細內容。因此,不必擔心選擇“錯誤的”框架,它們正在相互融合!最重要的是要學習背後的深度學習概念,您在其中一個框架中獲得的所有知識在另一個框架下照樣有用。

TensorFlow 還是 PyTorch?哪一個才更適合編寫深度神經網絡?

工業應用還是學術研究?

但是,很明顯,神經網絡的工業應用與學術研究是截然不同的。在這種情況下,決定選擇哪一個很重要。

TensorFlow是一個非常強大且成熟的Python庫,具有強大的可視化功能以及用於高性能模型開發的各種選項。它具有準備用於生產的部署共軛能,並自動支持Web和移動平臺。

另一方面,PyTorch仍然是一個年輕的框架,但是擁有一個非常活躍的社區,尤其是在研究領域。門戶網站The Gradient在附圖中顯示了主要的深度學習會議(CVPR,ICRL,ICML,NIPS,ACL,ICCV等)發表的研究論文中PyTorch的使用量,可以看到PyTorch在研究界的興起和廣泛採用。

從2018年的數據可以看出,Pythorch框架的使用還是少數,而相比之下,2019年的使用量對比TensorFlow是壓倒性的。因此,如果你想創造與人工智能相關的產品,TensorFlow是一個不錯的選擇。如果你想做研究,我推薦PyTorch。

TensorFlow 還是 PyTorch?哪一個才更適合編寫深度神經網絡?

新手請選擇Keras

如果你還是個萌新,對這一切都還很不瞭解,請從TensorFlow的Keras API開始。PyTorch的API具有更大的靈活性和控制力,但顯然TensorFlow的Keras API可以更容易上手。而且,如果您正在閱讀這篇文章,我假定您是深度學習領域的入門者。

順便說一句,Keras計劃在2020年推出幾種新特性,它們都是為了“讓事情變得更容易”。以下是最近添加的或即將發佈的一些新功能的列表:

  • 預處理層API

到目前為止,我們已經使用NumPy和PIL(Python Imaging Library)編寫的輔助工具完成了預處理。這種外部預處理使模型的可移植性降低,因為每次有人重用已經訓練好的模型時,他們都必須重新實現整個預處理流程。因此,通過“預處理層”,預處理現在可以成為模型的一部分。這包括諸如文本標準化,標記化,向量化,圖像標準化,數據增強等方面。也就是說,這將允許模型接受原始文本或原始圖像作為輸入。我個人認為這將非常有趣。

  • Keras Tuner

這是一個可讓您在Keras中找到模型的最佳超參數的框架。當你開始進行一些深度學習工作時,您會發現超參數的調整將是整個工作中最為繁重的部分,這個框架旨在解決這一問題。

  • AutoKeras

該項目旨在用幾行代碼建立一個很好的機器學習模型,根據可能的模型空間自動搜索最佳模型,並使用Keras Tuner查找進行超參數調整。對於高級用戶,AutoKeras還允許對搜索空間和過程的配置進行更高級別的控制。

  • Cloud Keras

我們的願景是讓程序員更容易地將本地代碼(我們的筆記本電腦或Google Colab本地工作)移動到雲端,使其能夠在雲端以最佳和分佈式的方式執行此代碼,而不必擔心集群或Docker參數。

  • 與TensorFlow集成

與TFX(TensorFlow Extended,用於管理機器學習生產應用程序的平臺)進行更多集成的工作正在進行中,併為將模型導出到TF Lite(用於移動和嵌入式設備的機器學習執行引擎)提供更好的支持。毫無疑問,改善對模型生產的支持對於Keras程序員的忠誠度至關重要。

TensorFlow 還是 PyTorch?哪一個才更適合編寫深度神經網絡?

小結

打個比方,你認為哪種語言是入門編程的最佳語言,C++還是Java?好吧…這取決於我們想用它做什麼,最重要的是取決於我們能學到什麼樣的工具。我們可能無法達成一致,因為我們有一個先入為主的觀點,我們很難改變對這個問題的回答(同樣的情況也發生在PyTorch和TensorFlow的“粉絲”身上😉 )。但我們都同意的一點是,最重要的是知道如何編程。事實上,無論我們從一種語言的編程中學到什麼,當我們使用另一種語言時,它都會為我們服務,對吧?對於框架來也是如此,重要的是要了解深入學習,而不是框架的語法細節,然後我們將這些知識用於正在流行的框架或者我們想用的其他框架。

本文代碼:

https://github.com/jorditorresBCN/PyTorch-vs-TensorFlow/blob/master/MNIST-with-PyTorch-and-TensorFlow.ipynb

colab google notebook:

https://colab.research.google.com/github/jorditorresBCN/PyTorch-vs-TensorFlow/blob/master/MNIST-with-PyTorch-and-TensorFlow.ipynb

TensorFlow 還是 PyTorch?哪一個才更適合編寫深度神經網絡?

新勳章,新獎品,高流量,還有更多福利等你來拿~

TensorFlow 還是 PyTorch?哪一個才更適合編寫深度神經網絡?

☞360金融新任首席科學家:別指望AI Lab做成中臺

☞搞懂微服務,從捕捉一頭野豬說起

☞AI 圖像智能修復老照片,效果驚豔到我了!| 附代碼

☞調查了 10,975 位 Go 語言開發者,我們有了這些發現!

☞架構師前輩告訴你:代碼該如何才能自己寫得容易,別人看得也不痛苦


分享到:


相關文章: