哪種框架最適合神經網絡編程呢?是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>
<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>
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仍然是一個年輕的框架,但是有一個非常活躍的社區,特別是在研究領域。
從圖中可以看出,相比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.總結
重要的是要了解深度學習,而不是每個框架的語法細節,