TensorFlow vs PyTorch:哪個是深度學習網絡編程的最佳框架呢?

TensorFlow vs PyTorch:哪個是深度學習網絡編程的最佳框架呢?

哪種框架最適合神經網絡編程呢?是TensorFlow還是PyTorch ?

首先讓我們構建一個神經網絡模型,該模型分別使用PyTorch和Keras(TensorFlow)對手寫數字進行分類。

1.對神經網絡進行編程的步驟

a)導入所需的Python庫

在這兩個框架中,我們需要首先導入一些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 vs 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 vs 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中,沒有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('\nTensorFlow model Accuracy  =', 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("\nPyTorch model Accuracy=", (correct_count/all_count))
#PyTorch model Accuracy  = 0.8657/<code>

2.更多

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

實際上,在過去兩年中,這兩個框架一直在不斷融合,相互學習。例如,在發佈的TensorFlow 2.2的新版本中,訓練步驟可以等同於PyTorch,現在程序員可以通過實現traint_step()來指定循環體的詳細內容。所以不要擔心選錯了框架。最重要的是要學習他們背後的深度學習概念,您在其中一個框架中獲得的知識在另一個框架中仍然有用。

3.生產還是研究?

但是,如果你想要的是將一個解決方案投入生產或在神經網絡中進行研究,情況就不同了。

TensorFlow是一個非常強大和成熟的Python庫,具有強大的可視化特性和多種用於高性能模型開發的選項。它為生產和web和移動平臺提供了自動支持。

另一方面,PyTorch仍然是一個年輕的框架,但是有一個非常活躍的社區,特別是在研究領域。

TensorFlow vs PyTorch:哪個是深度學習網絡編程的最佳框架呢?

從圖中可以看出,相比2018年,2019年使用PyTorch框架的人變多了。如果你想創造與人工智能相關的產品,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

這樣做的目的是使程序員更輕鬆地將代碼遷移到雲中,從而使其能夠以最佳的分佈式方式在雲中執行此代碼,而不必擔心群集或Docker參數。

與TensorFlow集成

與TFX (TensorFlow Extended,一個管理機器學習生產應用程序的平臺)進行更多集成的工作正在進行中,並更好地支持將模型導出到TF Lite。

5.總結

重要的是要了解深度學習,而不是每個框架的語法細節,


分享到:


相關文章: