Tensorflow還是PyTorch?哪一個才更適合編程實現深度神經網絡?

2021-01-11 deephub

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

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

導入所需的庫加載並預處理數據定義模型定義優化器和損失函數訓練模型評估模型這些步驟可以在任何一個框架中找到非常類似的實現(即使是像MindSpore這樣的框架)。為此,在本文中,我們將構建一個神經網絡模型,分別在PyTorch API與TensorFlow Keras API下進行手寫數字分類任務的實現。你可以在我的GitHub上找到對應的代碼實現,並且用colab google notebook來運行。

1. 神經網絡編程步驟

a)導入必要的庫

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

import numpy as np import matplotlib.pyplot as plt epochs = 10 batch_size=64

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

import tensorflow as tf

而對於PyTorch,您還需要導入這兩個庫:

import torch import torchvision

b)導入並預處理數據

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

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

而在PyTorch則是這兩行代碼:

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)

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

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]))

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))

c)定義模型

在定義模型的時候,這兩種框架都使用相當相似的語法來完成。 對於TensorFlow,可以使用以下代碼來完成:

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

在PyTorch下則這麼完成:

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

d)定義優化器與損失函數

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

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

在PyTorch下則是這樣的:

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

e)訓練模型

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

_ = modelTF.fit(x_trainTF, y_trainTF, epochs=epochs, batch_size=batch_size, verbose = 0)

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

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()

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

f)評估模型

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

_, (x_testTF, y_testTF)= tf.keras.datasets.mnist.load_data()x_testTF = x_testTF.reshape(10000, 784).astype('float32')/255y_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

在PyTorch中,再次需要程式設計師手動定義評估循環:

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, 0for 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 += 1print("\nAccuracy del model amb PyTorch =", (correct_count/all_count))TensorFlow model Accuracy = 0.8657

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

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

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

3. 工業應用還是學術研究?

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

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

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

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

4. 新手請選擇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程式設計師的忠誠度至關重要。

5. 小結

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

作者:Jordi TORRES.AI

deephub翻譯組:Alexander Zhao

相關焦點

  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    為了幫助開發這些架構,谷歌、Facebook 和 Uber 等科技巨頭已經為 Python 深度學習環境發布了多款框架,這讓人們可以更輕鬆地學習、構建和訓練不同類型的神經網絡。本文將詳細介紹和比較兩種流行的框架: TensorFlow 與 PyTorch。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    一、發展演變歷程keraskeras出身就像是一個天生麗質的姑娘,是多個計算後臺框架的」前端」。keras是神經網絡的一個模型計算框架,嚴格來說不是神經網絡框架。起初的計算後臺為Theano(和tensorflow差不多的一個框架),後來經過一系列的劇情,現在默認的計算後臺就為tensorflow了。另外由於tensorflow1.0的細節過於繁瑣混亂,升級版的tensorflow2.0基本拋棄了上述編寫語法。其自家小弟tensorflow.keras 已經和keras版本同步了。
  • 深度學習筆記8:利用Tensorflow搭建神經網絡
    作者:魯偉 一個數據科學踐行者的學習日記。
  • 作為TensorFlow的底層語言,你會用C++構建深度神經網絡嗎?
    隨著 C++ API 的完善,直接使用 C++來搭建神經網絡已經成為可能,本文將向你介紹一種簡單的實現方法。很多人都知道 TensorFlow 的核心是構建在 C++之上的,但是這種深度學習框架的大多數功能只在 Python API 上才方便使用。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理|深度
    雷鋒網按:本文作者姚健,畢業於中科院計算所網絡數據實驗室,曾就職於360天眼實驗室,主要從事深度學習和增強學習相關研究工作。目前就職於騰訊MIG事業部,從事神經機器翻譯工作。本文依據對Tensorflow(簡稱TF)白皮書[1]、TF Github[2]和TF官方教程[3]的理解,從系統和代碼實現角度講解TF的內部實現原理。以Tensorflow r0.8.0為基礎,本文由淺入深的闡述Tensor和Flow的概念。先介紹了TensorFlow的核心概念和基本概述,然後剖析了OpKernels模塊、Graph模塊、Session模塊。1.
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    目錄PyTorch概述TensorFlow概述了解問題陳述:MNIST在PyTorch中實現卷積神經網絡(CNN)在TensorFlow中實施卷積神經網絡(CNN)PyTorch概述PyTorch在深度學習社區中越來越受歡迎,並且被深度學習從業者廣泛使用,PyTorch是一個提供Tensor計算的Python軟體包。
  • 深度解讀TensorFlow,了解它的最新發展!
    TensorBoard  TensorBoard是一套可視化工具,研發人員使用TensorFlow寫的神經網絡看上去會顯得非常複雜混亂,為了可以更加直觀的調試、優化神經網絡,谷歌開發了TensorBoard。
  • TensorFlow 資源大全中文版
    循環神經網絡模型/工程圖片形態轉換 – 無監督圖片形態轉換的實現Show, Attend and Tell算法 -基於聚焦機制的自動圖像生成器Neural Style – Neural Style 算法的TensorFlow實現Pretty Tensor – Pretty Tensor提供了高級別的
  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    她在 Insight 工作的時候,在安卓系統上用 TensorFlow 部署了一個 WaveNet 模型。本文詳細介紹了部署和實現過程。對於個人和公司來說,存在許多狀況是更希望在本地設備上做深度學習推斷的:想像一下當你在旅行途中沒有可靠的網際網路連結時,或是要處理傳輸數據到雲服務的隱私問題和延遲問題時。
  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    用來實現高性能深度學習推理的平臺——TensorRT 與 TensorFlow Serving 打通結合,使用戶可以輕鬆地實現最佳性能的 GPU 推理。TensorFlow Serving 是應用於機器學習模型的靈活的高性能服務系統,而 NVIDIA TensorRT 則是一個用以實現高性能深度學習推理的平臺,將二者相結合後,用戶可以輕鬆地實現最佳性能的 GPU 推理。
  • Keras和TensorFlow究竟哪個會更好?
    在這其中,TensorFlow 作為最為著名的用於深度學習生產環境的框架,它有一個非常強大的生態體系支持,然而,相比其他框架,TensorFlow 也有其劣勢,如速度較慢、使用上手難。而基於 TensorFlow 基礎上構建的 Keras 提供了簡單易用的 API 接口,非常適合初學者使用。
  • 最熱門的深度學習框架TensorFlow入門必備書籍
    但進入機器學習和人工智慧領域並不是一件簡單的事情,目前市場上有許多大量的學習資源,許多開發者和想要進入的愛好者往往很難找到適合自己的發展路徑。其實,早在 2015 年底,谷歌就開源了內部使用的深度學習框架 TensorFlow 。眾多研究表明,Tensorflow 是研究深度學習的首選平臺。
  • 神經網絡篇——用TensorFlow2.0框架實現BP網絡
    那這個感知器模型和BP網絡有什麼關係呢?在我們所看到的BP網絡的結構圖中,其實是被簡化了的,下面小編畫了一個邏輯更清晰一點的圖:這樣我們就可以看出來,其實BP網絡是由一個一個的感知器組成,也就構成了一個真正的神經網絡,自然就能理解為什麼要使用激活函數了。接下來我們來看一下TensorFlow實現BP神經網絡到底有多簡單!
  • 入門| Tensorflow實戰講解神經網絡搭建詳細過程
    【IT168 技術】之前我們講了神經網絡的起源、單層神經網絡、多層神經網絡的搭建過程、搭建時要注意到的具體問題、以及解決這些問題的具體方法。本文將通過一個經典的案例:MNIST手寫數字識別,以代碼的形式來為大家梳理一遍神經網絡的整個過程。
  • 還不會使用PyTorch框架進行深度學習的小夥伴,看過來
    深度學習是機器學習的一個子領域,其算法受到了人類大腦工作機制的啟發。這些算法被稱為人工神經網絡。這樣的神經網絡包括用於圖像分類的卷積神經網絡、人工神經網絡和循環神經網絡。Pytorch 簡介Pytorch 是一個基於 Torch 的 Python 機器學習包,而 Torch 則是一個基於程式語言 Lua 的開源機器學習包。
  • tensorflow初級必學算子
    在之前的文章中介紹過,tensorflow框架的核心是將各式各樣的神經網絡抽象為一個有向無環圖,圖是由tensor以及tensor變換構成;雖然現在有很多高階API可以讓開發者忽略這層抽象,但對於靈活度要求比較高的算法仍然需要開發者自定義網絡圖,所以建議開發者儘量先學習tf1.x
  • Pytorch中的分布式神經網絡訓練
    隨著深度學習的多項進步,複雜的網絡(例如大型transformer 網絡,更廣更深的Resnet等)已經發展起來,從而需要了更大的內存空間。 經常,在訓練這些網絡時,深度學習從業人員需要使用多個GPU來有效地訓練它們。 在本文中,我將向您介紹如何使用PyTorch在GPU集群上設置分布式神經網絡訓練。通常,分布式訓練會在有一下兩種情況。
  • PyTorch和TensorFlow哪家強:九項對比讀懂各自長項短板
    這篇文章的目的是幫助那些想要開始一個新項目或從一種深度學習框架切換到另一種框架的人。本文重點關注的是在設置訓練組件和部署深度學習時的可編程性和靈活性。我不會深入到性能方面(速度/內存佔用)的比較。上手時間獲勝者:PyTorchPyTorch 本質上是支持 GPU 的 NumPy 替代,配備了可用於構建和訓練深度神經網絡的更高級的功能
  • 基於TensorFlow2.0的中文深度學習開源書來了!GitHub趨勢日榜第一
    十三 發自 凹非寺 量子位 報導 | 公眾號 QbitAITensorFlow 2.0 發布已有一個半月之久,你會用了嗎?近日,一個叫做深度學習開源書的項目在火了。深度學習開源書介紹這本書共包含15個章節。從目錄章節構成來看,理論與編程並不是獨立分開,而是隨著難度的遞增,循序漸進、穿插編排的。大體上可以分為四個部分。
  • 【強化學習實戰】基於gym和tensorflow的強化學習算法實現
    1新智元推薦【新智元導讀】知乎專欄強化學習大講堂作者郭憲博士開講《強化學習從入門到進階》,我們為您節選了其中的第二節《基於gym和tensorflow的強化學習算法實現》,希望對您有所幫助。同時,由郭憲博士等擔任授課教師的深度強化學習國慶集訓營也將於 10 月 2 日— 6 日在北京舉辦。