TensorFlow與PyTorch — 線性回歸

2021-12-28 相約機器人

來源 | 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的最佳特性

點擊「閱讀原文」圖書配套資源

相關焦點

  • GitHub趨勢榜第一:TensorFlow+PyTorch深度學習資源大匯總
    deeplearning-models/blob/master/pytorch_ipynb/basic-ml/perceptron.ipynb邏輯回歸TensorFlow 1:https://github.com/rasbt/deeplearning-models/blob/master/tensorflow1_ipynb/
  • 損失函數理解匯總,結合PyTorch1.7和TensorFlow2
    它的導數具有封閉解,優化和編程非常容易,所以很多回歸任務都是用MSE作為損失函數。[8] https://pytorch.org/docs/stable/generated/torch.nn.BCEWithLogitsLoss.html[9] https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html[10] https://www.tensorflow.org
  • 深度學習環境配置指南:Pytorch、TensorFlow、Keras
    導讀本文介紹了作者使用RTX3090進行深度學習環境配置pytorch、tensorflow、keras等的詳細過程及代碼。筆者中山大學研究生,醫學生+計科學生的集合體,機器學習愛好者。-7.2.1.4-cp36-none-linux_x86_64.whl tensorflow_estimator-1.15.1-py2.py3-none-any.whl nvidia_tensorboard-1.15.0+nv20.10-py3-none-any.whlnvidia_tensorflow-1.15.4+nv20.10-cp36-cp36m-linux_x86_64.whl -i http
  • 損失函數理解匯總,結合 PyTorch1.7 和 TensorFlow2
    它的導數具有封閉解,優化和編程非常容易,所以很多回歸任務都是用MSE作為損失函數。[8] https://pytorch.org/docs/stable/generated/torch.nn.BCEWithLogitsLoss.html[9] https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html[10] https://www.tensorflow.org
  • 【綜述專欄】損失函數理解匯總,結合PyTorch和TensorFlow2
    [10] https://www.tensorflow.org/api_docs/python/tf/keras/losses/KLD[11] https://www.tensorflow.org/api_docs/python/tf/keras/losses/KLDivergence[12] https://pytorch.org/docs/stable/
  • 寫給純小白的深度學習環境搭建寶典:pytorch+tensorflow
    小編強烈建議為pytorch建立一個虛擬環境,這樣做的好處是方便我們同時使用多個深度學習框架,每個框架就對應一個虛擬環境,框架之間可以互不幹擾。具體步驟:Windows用戶搜索打開Anaconda Prompt,然後輸入:source create -n pytorch python=3.5,pytorch是這個虛擬環境的名字,你也可以給它起個別的名字,Python的版本我們也可以指定為3.6。
  • RTX 3090 的深度學習環境配置指南:Pytorch、TensorFlow、Keras
    導讀本文介紹了作者使用RTX3090進行深度學習環境配置pytorch、tensorflow、keras等的詳細過程及代碼。筆者中山大學研究生,醫學生+計科學生的集合體,機器學習愛好者。-7.2.1.4-cp36-none-linux_x86_64.whl tensorflow_estimator-1.15.1-py2.py3-none-any.whl nvidia_tensorboard-1.15.0+nv20.10-py3-none-any.whlnvidia_tensorflow-1.15.4+nv20.10-cp36-cp36m-linux_x86_64.whl -i http
  • PyTorch 能追上 TensorFlow 嗎?
    來源:https://chillee.github.io/pytorch-vs-tensorflow/對於該會議1_dCf91WMBzCkCW7_KNMVSTQ來源:https://chillee.github.io/pytorch-vs-tensorflow/
  • 深度學習100+經典模型TensorFlow與Pytorch代碼實現大集合
    傳統機器學習感知器 Perceptron   [TensorFlow 1: GitHub | Nbviewer]https://github.com/rasbt/deeplearning-models/blob/master/tensorflow1
  • TensorFlow 與 PyTorch 之爭
    論文地址:http://download.tensorflow.org/paper/whitepaper2015.pdfTensorFlow 現已被公司、企業與創業公司廣泛用於自動化工作任務和開發新系統,其在分布式訓練支持、可擴展的生產和部署選項、多種設備(比如安卓)支持方面備受好評。
  • PyTorch 完全入門指南!從線性回歸、邏輯回歸到圖像分類
    本文共分3大部分:安裝PyTorch和Jupyter Notebook用PyTorch實現線性回歸使用邏輯回歸實現圖像分類文章超長,秉承用代碼搞定一切的原則,內含大量代碼,建議收藏,並分享給你喜歡的人。同時如果有什麼疑問,也歡迎留言告知我們。Tips:為了方便演示,文中代碼和返回結果是用截圖形式給出。
  • 2020,PyTorch真的趕上TensorFlow了嗎?
    圖源:https://chillee.github.io/pytorch-vs-tensorflow/下圖展示了 PyTorch 和 TensorFlow 在 NeurIPS 會議論文中(2016 年-2019 年)的直觀對比和趨勢發展,實線代表 PyTorch,虛線代表 TensorFlow:其中,在 2019 NeurIPS 會議論文中,PyTorch
  • 【Pytorch】PyTorch的4分鐘教程,手把手教你完成線性回歸
    下文出現的所有功能函數,均可以在中文文檔中查看具體參數和實現細節,先附上pytorch中文文檔連結:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch/
  • PyTorch的4分鐘教程,手把手教你完成線性回歸
    下文出現的所有功能函數,均可以在中文文檔中查看具體參數和實現細節,先附上pytorch中文文檔連結:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch/
  • 初學TensorFlow機器學習:如何實現線性回歸?(附練習題)
    參數 w 的不同值代表不同的線性方程。所有這些線性方程的集合構成線性模型 M。M 是所有可能的模型的集合。每選定一個 w 的值就會生成候選模型 M(w):y=wx。在 TensorFlow 中編寫的回歸算法將迭代收斂到更好的模型參數 w。我們稱最佳參數為 w*,最佳擬合方程為 M(w*):y=w*x。
  • 從TensorFlow.js入手了解機器學習
    權值(Weight):和突觸一樣,它們以增減來調整神經的活動來達成更好的線性回歸。線性函數 (Linear function):每個神經就像一個線性回歸函數,目前為止一個線性回歸函數只需要一個神經。激活函數 (Activation function):我們能提供一些激活函數來改變從一個標量 (Scalar) 到另一個非線性的函數。
  • Pytorch還是TensorFlow?頂會帶你覽趨勢
    圖表的交互版本參見:http://horace.io/pytorch-vs-tensorflow/ICLR 2020 論文 PyTorch/TensorFlow 使用分析首先看下 ICLR 2020 接收論文中,PyTorch 使用數在 TensorFlow/PyTorch 使用總數的佔比情況:佔比超過 50% 則意味著該頂會接收論文中使用 PyTorch 的多於
  • PyTorch稱霸頂會:CVPR論文佔比是TensorFlow 4 倍
    圖表的交互版本參見:http://horace.io/pytorch-vs-tensorflow/ICLR 2020 論文 PyTorch/TensorFlow 使用分析首先看下 ICLR 2020 接收論文中,PyTorch 使用數在
  • 從零開始搭建深度學習伺服器:TensorFlow + PyTorch + Torch
    python-pip python-dev python-virtualenv mkdir tensorflowcd tensorflowvirtualenv --system-site-packages venvsource venv/bin/activatepip install --upgrade tensorflow-gpu測試GPU:
  • TensorFlow發布JavaScript開發者的機器學習框架TensorFlow.js
    發布新的 TensorFlow 官方博客(http://blog.tensorflow.org/)與 TensorFlow YouTube 頻道;2. 面向 JavaScript 開發者的全新機器學習框架 TensorFlow.js;3.