成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對比PyTorch和TensorFlow的自動差異和動態模型

新聞 前端
這篇簡短的文章重點介紹如何在PyTorch 1.x和TensorFlow 2.x中分別使用帶有模塊/模型API的動態子類化模型,以及這些框架在訓練循環中如何使用AutoDiff獲得損失的梯度并從頭開始實現 一個非常幼稚的漸變后代實現。

 使用自定義模型類從頭開始訓練線性回歸,比較PyTorch 1.x和TensorFlow 2.x之間的自動差異和動態模型子類化方法,

這篇簡短的文章重點介紹如何在PyTorch 1.x和TensorFlow 2.x中分別使用帶有模塊/模型API的動態子類化模型,以及這些框架在訓練循環中如何使用AutoDiff獲得損失的梯度并從頭開始實現 一個非常幼稚的漸變后代實現。

對比PyTorch和TensorFlow的自動差異和動態模型

生成噪聲的線性數據

為了專注于自動差異/自動漸變功能的核心,我們將使用最簡單的模型,即線性回歸模型,然后我們將首先使用numpy生成一些線性數據,以添加隨機級別的噪聲。

  1. def generate_data(m=0.1, b=0.3, n=200): 
  2.   x = np.random.uniform(-1010, n) 
  3.   noise = np.random.normal(00.15, n) 
  4.   y = (m * x + b ) + noise  return x.astype(np.float32), y.astype(np.float32) 
  5. x, y = generate_data()plt.figure(figsize = (12,5)) 
  6. ax = plt.subplot(111
  7. ax.scatter(x,y, c = "b", label="samples"
對比PyTorch和TensorFlow的自動差異和動態模型

模型

然后,我們將在TF和PyTorch中實現從零開始的線性回歸模型,而無需使用任何層或激活器,而只需定義兩個張量w和b,分別代表線性模型的權重和偏差,并簡單地實現線性函數即可:y = wx + b

正如您在下面看到的,我們的模型的TF和PyTorch類定義基本上完全相同,但在一些api名稱上只有很小的差異。

唯一值得注意的區別是,PyTorch明確地使用Parameter對象定義權重和要由圖形"捕獲"的偏置張量,而TF似乎在這里更"神奇",而是自動捕獲用于圖形的參數。

確實在PyTorch參數中是Tensor子類,當與Module api一起使用時,它們具有非常特殊的屬性,可以自動將自身添加到Module參數列表中,并會出現在在parameters()迭代器中。

無論如何,兩個框架都能夠從此類定義和執行方法(call或 forward ),參數和圖形定義中提取信息,以便向前執行圖形執行,并且正如我們將看到的那樣,通過自動可微分獲得梯度功能,以便能夠執行反向傳播。

TensorFlow動態模型

  1. class LinearRegressionKeras(tf.keras.Model): 
  2.   def __init__(self): 
  3.     super().__init__()    self.w = tf.Variable(tf.random.uniform(shape=[1], -0.10.1)) 
  4.     self.b = tf.Variable(tf.random.uniform(shape=[1], -0.10.1)) 
  5.       def __call__(self,x):  
  6.     return x * self.w + self.b 

PyTorch動態模型

  1. class LinearRegressionPyTorch(torch.nn.Module):  
  2.   def __init__(self):  
  3.     super().__init__()     self.w = torch.nn.Parameter(torch.Tensor(11).uniform_(-0.10.1)) 
  4.     self.b = torch.nn.Parameter(torch.Tensor(1).uniform_(-0.10.1)) 
  5.     def forward(self, x):   
  6.     return x @ self.w + self.b 

訓練循環,反向傳播和優化器

現在我們已經實現了簡單的TensorFlow和PyTorch模型,我們可以定義TF和PyTorch api來實現均方誤差的損失函數,最后實例化我們的模型類并運行訓練循環。

同樣,本著眼于自動差異/自動漸變功能核心的目的,我們將使用TF和PyTorch特定的自動差異實現方式實現自定義訓練循環,以便為我們的簡單線性函數提供漸變并手動優化權重和偏差參數以及臨時和樸素的漸變后代優化器。

在TensorFlow訓練循環中,我們將特別明確地使用GradientTape API來記錄模型的正向執行和損失計算,然后從該GradientTape中獲得用于優化權重和偏差參數的梯度。

相反,在這種情況下,PyTorch提供了一種更"神奇"的自動漸變方法,隱式捕獲了對參數張量的任何操作,并為我們提供了相同的梯度以用于優化權重和偏置參數,而無需使用任何特定的api。

一旦我們有了權重和偏差梯度,就可以在PyTorch和TensorFlow上實現我們的自定義梯度派生方法,就像將權重和偏差參數減去這些梯度乘以恒定的學習率一樣簡單。

此處的最后一個微小區別是,當PyTorch在向后傳播中更新權重和偏差參數時,以更隱蔽和"魔術"的方式實現自動差異/自動graf時,我們需要確保不要繼續讓PyTorch從最后一次更新操作中提取grad,這次明確調用no_grad api,最后將權重和bias參數的梯度歸零。

TensorFlow訓練循環

  1. def squared_error(y_pred, y_true): 
  2.   return tf.reduce_mean(tf.square(y_pred - y_true)) 
  3. tf_model = LinearRegressionKeras()[w, b] = tf_model.trainable_variablesfor epoch in range(epochs): 
  4.   with tf.GradientTape() as tape: 
  5.     predictions = tf_model(x)    loss = squared_error(predictions, y)          w_grad, b_grad = tape.gradient(loss, tf_model.trainable_variables)  w.assign(w - w_grad * learning_rate)  b.assign(b - b_grad * learning_rate)  if epoch % 20 == 0
  6.     print(f"Epoch {epoch} : Loss {loss.numpy()}"

PyTorch訓練循環

  1. def squared_error(y_pred, y_true): 
  2.   return torch.mean(torch.square(y_pred - y_true)) 
  3. torch_model = LinearRegressionPyTorch()[w, b] = torch_model.parameters()for epoch in range(epochs): 
  4.   y_pred = torch_model(inputs)  loss = squared_error(y_pred, labels)  loss.backward()    with torch.no_grad(): 
  5.     w -= w.grad * learning_rate    b -= b.grad * learning_rate    w.grad.zero_()    b.grad.zero_()      if epoch % 20 == 0
  6.     print(f"Epoch {epoch} : Loss {loss.data}"

結論

正如我們所看到的,TensorFlow和PyTorch自動區分和動態子分類API非常相似,當然,兩種模型的訓練也給我們非常相似的結果。

在下面的代碼片段中,我們將分別使用Tensorflow和PyTorch trainable_variables和parameters方法來訪問模型參數并繪制學習到的線性函數的圖。

繪制結果

  1. [w_tf, b_tf] = tf_model.trainable_variables 
  2. [w_torch, b_torch] = torch_model.parameters()with torch.no_grad():  plt.figure(figsize = (12,5)) 
  3.   ax = plt.subplot(111
  4.   ax.scatter(x, y, c = "b", label="samples"
  5.   ax.plot(x, w_tf * x + b_tf, "r"5.0"tensorflow"
  6.   ax.plot(x, w_torch * inputs + b_torch, "c"5.0"pytorch"
  7.   ax.legend()  plt.xlabel("x1"
  8.   plt.ylabel("y",rotation = 0
對比PyTorch和TensorFlow的自動差異和動態模型

 

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2018-03-30 12:40:10

潤乾差異數據

2020-10-27 09:37:43

PyTorchTensorFlow機器學習

2017-03-02 14:52:46

2009-09-10 17:44:36

DOM模型INQ模型

2017-11-01 15:13:49

TensorFlow神經網絡深度學習

2021-07-01 16:45:17

PyTorchTensorflow 機器學習

2019-03-10 22:22:06

PyTorchKeras深度學習

2021-12-19 22:51:24

PyTorchTensorFlow框架

2022-10-09 15:26:45

人工智能ML機器學習

2021-03-18 08:59:14

框架pytorchtensorflow

2021-08-09 15:56:43

機器學習人工智能計算機

2017-06-13 22:56:27

動態圖PyTorchKeras

2017-02-21 10:00:44

大數據深度學習框架對比

2024-03-25 11:44:42

2011-03-23 17:11:21

Lampwamp

2010-06-23 14:20:06

eMule協議

2023-02-13 12:15:41

自動駕駛算法

2024-05-28 08:11:44

SpringTensorFlow訓練

2024-03-06 13:15:40

人工智能

2010-09-25 13:20:22

DHCP BOOTP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品在线播放 | 一级黄色毛片子 | 国产精品午夜电影 | 一区二区免费 | 亚洲视频在线看 | 麻豆av在线免费观看 | 91久久国产 | 久久精品美女 | 国产一区二区日韩 | 亚洲综合三区 | 欧美精品一区二区三区在线四季 | 毛片毛片毛片毛片毛片 | 亚洲综合成人网 | 精品美女视频在免费观看 | 91精品在线播放 | 欧美一二区 | 日韩av网址在线观看 | 久久久国产精品 | 亚洲不卡在线观看 | 午夜精品一区二区三区在线播放 | 国产精品欧美一区二区三区不卡 | 日韩av手机在线观看 | 亚洲 中文 欧美 日韩 在线观看 | 涩涩视频网站在线观看 | 国产福利在线播放麻豆 | 中国美女av| 国产精品a久久久久 | 在线中文视频 | 欧美成人h版在线观看 | 国产视频久久久 | 欧美激情久久久 | 国产欧美一区二区三区久久手机版 | 日韩精品在线网站 | 中文在线www | 国产一区二区久久 | 国产成人一区二区三区久久久 | www.xxxx欧美 | 欧美一区二区三区 | 国产精品亚洲成在人线 | 精品一二三区在线观看 | 欧美综合一区二区三区 |