來源 | Medium
編輯 | 代碼醫生團隊
如果是深度學習和神經網絡的新手,那麼一定遇到過「 TensorFlow 」和「 PyTorch 」 這兩個術語。這是在數據科學領域中使用的兩個流行的深度學習框架。
在本練習中,將展示使用這兩個框架實現的最簡單的神經網絡(線性回歸)並比較其結果。
起源
PyTorch是基於Torch庫的開源機器學習庫。PyTorch主要由Facebook的AI研究實驗室(FAIR)開發。它是一個免費的開源軟體。
另一方面,TensorFlow由Google Brain團隊開發,用於內部Google研究。它廣泛用於機器學習應用程式,例如神經網絡。它也是一個免費的開源軟體。
比較兩個框架的最有效的方法是使用兩個框架來解決同一問題並分析其結果。在本練習中,將同時使用TensorFlow和PyTorch框架執行線性回歸併比較其結果。
問題
在本練習中,將使用一個非常簡單的示例。在這裡,得到了一個數字數組,x = [-1.0,0.0,1.0,2.0,3.0,4.0]和y = [-3.0,-1.0,1.0,3.0,5.0,7.0]。在此使用的公式是y = 2 * x -1,它是線性回歸。
x= [-1.0, 0.0, 1.0, 2.0, 3.0, 4.0]
y= [-3.0, -1.0, 1.0, 3.0, 5.0, 7.0]
y = 2*x -1
在使用兩個框架訓練線性回歸模型時,將輸入x = 10的新值,並查看該模型對y的預測。
TensorFlow框架
首先,將研究TensorFlow框架。
import tensorflow as tfimport numpy as npfrom tensorflow import keras
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)
model.fit(xs, ys, epochs=500)
print(model.predict([10.0]))TensorFlow —線性回歸
這是使用keras庫使用TensorFlow執行線性回歸的代碼。遍歷以上程序中的每個代碼塊。
第一步,將導入庫。
import tensorflow as tf
import numpy as np
from tensorflow import keras
下一步,使用順序模型設計模型,該模型是線性的層堆疊。在此模型中,僅使用一層(神經元)。
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
在第二步中,定義優化器和損失函數以訓練神經網絡模型。在本文中,使用隨機梯度下降(SDG)優化器和均方誤差(MSE)作為損失函數。
model.compile(optimizer='sgd', loss='mean_squared_error')
在此步驟之後,使用兩個變量「 xs 」和「 ys 」 初始化數字。
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)
在最後一步,我們將模型擬合到變量「 xs」和「 ys」。以500個時期訓練模型。
model.fit(xs, ys, epochs=500)
>>Epoch 500/500
1/1 [==============================] - 0s 1ms/step - loss: 5.1584e-05
在最後一步中,預測新的xs = 10的值。根據公式y = 2 * x-1,對於xs = 10,得到的值為19。現在看看使用TensorFlow框架創建的模型可以預測什麼價值。
model.fit(xs, ys, epochs=500)
>>Epoch 500/500
1/1 [==============================] - 0s 1ms/step - loss: 5.1584e-05
看到,使用使用TensorFlow Framework設計的線性回歸模型,得到的值接近19。
PyTorch框架
現在看看使用PyTorch框架設計的線性回歸模型。
import torchfrom torch.autograd import Variable
xs = [[-1.0], [0.0], [1.0], [2.0], [3.0], [4.0]]ys = [[-3.0], [-1.0], [1.0], [3.0], [5.0], [7.0]]
xs = Variable(torch.Tensor(xs))ys = Variable(torch.Tensor(ys))
class LinearRegressionModel(torch.nn.Module):
def __init__(self): super(LinearRegressionModel, self).__init__() self.linear = torch.nn.Linear(1, 1)
def forward(self, x): y_pred = self.linear(x) return y_pred
model = LinearRegressionModel()
criterion = torch.nn.MSELoss(size_average = False)optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)
for epoch in range(500): pred_y = model(xs) loss = criterion(pred_y, ys) optimizer.zero_grad() loss.backward() optimizer.step() print('epoch {}, loss {}'.format(epoch, loss.item()))
new_var = Variable(torch.Tensor([[10.0]]))pred_y = model(new_var)print(model(new_var).item())PyTorch —線性回歸
與TensorFlow模型相比,線性回歸的PyTorch應用程式確實龐大而複雜。分析模型的每個步驟。
第一步,導入設計線性回歸模型所需的庫。
import torch
from torch.autograd import Variable
在下一步中,初始化與TensorFlow模型中定義的「 xs 」和「 ys 」 相同的值。對於PyTorch應用程式,使用適當的函數將列錶轉換為Tensor 。
xs = [[-1.0], [0.0], [1.0], [2.0], [3.0], [4.0]]
ys = [[-3.0], [-1.0], [1.0], [3.0], [5.0], [7.0]]
xs = Variable(torch.Tensor(xs))
ys = Variable(torch.Tensor(ys))
此後定義一個類「 LinearRegressionModel 」,將使用該類來定義模型。由於這是具有1個輸入和1個輸出的簡單線性回歸,因此使用線性模型,其輸入和輸出維數均等於1。最後,使用上述定義的類創建「 模型 」。
class LinearRegressionModel(torch.nn.Module):
def __init__(self): super(LinearRegressionModel, self).__init__() self.linear = torch.nn.Linear(1, 1) # One in and one out
def forward(self, x): y_pred = self.linear(x) return y_pred
model = LinearRegressionModel()接下來,選擇優化器和損失準則。選擇了與TensorFlow應用程式相同的功能,即針對優化器的SDG功能和針對損失功能的MSE。此外,任意設定學習率為 0.01。
criterion = torch.nn.MSELoss(size_average = False)
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)
現在,進入訓練步驟。在此階段,將紀元值設置為500,從而執行了500次迭代的三個任務。
做一個直傳通過將數據和預測YS每個XS的價值。
計算損失使用MSE損失函數。
將所有梯度重置為0,執行反向傳播,最後更新權重。
for epoch in range(500):
# Forward pass: Compute predicted y by passing # x to the model pred_y = model(xs)
# Compute and print loss loss = criterion(pred_y, ys)
# Zero gradients, perform a backward pass, # and update the weights. optimizer.zero_grad() loss.backward() optimizer.step() print('epoch {}, loss {}'.format(epoch, loss.item()))>>epoch 499, loss 5.151434834260726e-13最後,使用該模型預測新的xs = 10的值。如前所述,必須獲得接近19的值。現在看看PyTorch模型的輸出。
new_var = Variable(torch.Tensor([[10.0]]))
pred_y = model(new_var)
print(model(new_var).item())
>>18.999998092651367
看到使用PyTorch框架構建的線性回歸模型也提供了接近19的值。
比較
通過可視化從TensorFlow和PyTorch模型獲得的結果,看到TensorFlow模型給結果為18.979048,而PyTorch模型結果為18.999998092651367。
TensorFlow模型— 18.979048
PyTorch模型— 18.999998092651367
可以清楚地看到,使用PyTorch框架構建的非常簡單的神經網絡比使用TensorFlow框架構建的模型具有更高的準確性。但是,PyTorch模型本質上更加複雜,初學者很難理解。
如果是深度學習和神經網絡的新手,建議大家先從TensorFlow框架開始,然後在獲得前者的經驗後再轉向PyTorch框架。
在Github配置文件中隨附了兩個框架的詳細代碼版本(.ipynb),以供參考。
https://github.com/mk-gurucharan/TensorFlow-vs-PyTorch-Linear-Regression-/
希望能夠使用深度學習中當今使用的兩個最受歡迎的框架來解釋和演示一個簡單的神經網絡(線性回歸模型)的實現。
推薦閱讀
Texar-PyTorch:在PyTorch中集成TensorFlow的最佳特性
點擊「閱讀原文」圖書配套資源