TensorFlow2.0教程29:使用低級api訓練(非tf.keras)

  1、Variablespython

  TensorFlow的張量是不可變的無狀態對象。當咱們有要改變的張量時,可使用python的特性,把計算獲得的值賦給這個python變量。app

  x = tf.ones([6,6])dom

  x = x + 3 # x+3後獲得了一個新的張量,並把這個張量賦給x機器學習

  print(x)函數

  tf.Tensor(學習

  [[4. 4. 4. 4. 4. 4.]測試

  [4. 4. 4. 4. 4. 4.]優化

  [4. 4. 4. 4. 4. 4.]spa

  [4. 4. 4. 4. 4. 4.]orm

  [4. 4. 4. 4. 4. 4.]

  [4. 4. 4. 4. 4. 4.]], shape=(6, 6), dtype=float32)

  然而機器學習中間須要變化的狀態(每一個參數朝損失變小的方向改變,因此TensorFlow也要內置有狀態的操做,這就是Variables,它能夠表示模型中的參數,並且方便高效。

  Variables是一個存在值的對象,當其被使用是,它被隱式地被從存儲中讀取,而當有諸如tf.assign_sub, tf.scatter_update這樣的操做時,獲得的新值會儲存到原對象中。

  v = tf.Variable(2)

  v.assign(6)

  print(v)

  v.assign_add(tf.square(3))

  print(v)

  注:梯度計算時會自動跟蹤變量的計算(不用watch),對錶示嵌入的變量,TensorFlow會默認使用稀疏更新,這樣能夠提升計算和存儲效率。

  2、示例:擬合線性模型

  使用Tensor, Variable和GradientTape這些簡單的要是,就能夠構建一個簡單的模型。步驟以下:

  定義模型

  定義損失函數

  獲取訓練數據

  模型訓練,使用優化器調整變量

  在下面咱們會構造一個簡單的線性模型:f(x) = W + b, 它有2個變量W和b,同時咱們會使用W=3.0,b=2.0來構造數據,用於學習。

  一、定義模型

  咱們把模型定義爲一個簡單的類,裏面封裝了變量和計算

  class Model(object):

  def __init__(self):

  # 初始化變量

  self.W = tf.Variable(5.0)

  self.b = tf.Variable(0.0)

  def __call__(self, x):

  return self.W * x + self.b

  # 測試

  model = Model()

  print(model(2))

  tf.Tensor(10.0, shape=(), dtype=float32)

  2.定義損失函數

  損失函數測量給定輸入的模型輸出與指望輸出的匹配程度。 這裏使用標準的L2損失。

  def loss(predicted_y, true_y):

  return tf.reduce_mean(tf.square(predicted_y - true_y))

  3.獲取訓練數據

  生成帶有噪音的數據

  TRUE_W = 3.0

  TRUE_b = 2.0

  num = 1000

  # 隨機輸入

  inputs = tf.random.normal(shape=[num])

  # 隨機噪音

  noise = tf.random.normal(shape=[num])

  # 構造數據

  outputs = TRUE_W * inputs + TRUE_b + noise

  在咱們訓練模型以前,讓咱們能夠看到模型如今所處的位置。 咱們將用紅色繪製模型的預測,用藍色繪製訓練數據。

  import matplotlib.pyplot as plt

  plt.scatter(inputs, outputs, c='b')

  plt.scatter(inputs, model(inputs), c='r')

  plt.show()

  # 當前loss

  print('Init Loss:')

  print(loss(model(inputs), outputs)) 

  Init Loss:

  tf.Tensor(8.763554, shape=(), dtype=float32)

  4.定義訓練循環無錫人流醫院哪家好 http://www.wxbhnkyy120.com/

  咱們如今已經有了模型和訓練數據。 咱們準備開始訓練,即便用訓練數據來更新模型的變量(W和b),以便使用梯度降低來減小損失。 在tf.train.Optimizer中實現了許多梯度降低方案的變體。 強烈建議你們使用這些實現,但本着從第一原則構建的精神,在這個特定的例子中,咱們將本身實現基本的優化器。

  def train(model, inputs, outputs, learning_rate):

  # 記錄loss計算過程

  with tf.GradientTape() as t:

  current_loss = loss(model(inputs), outputs)

  # 對W,b求導

  dW, db = t.gradient(current_loss, [model.W, model.b])

  # 減去梯度×學習率

  model.W.assign_sub(dW*learning_rate)

  model.b.assign_sub(db*learning_rate)

  咱們反覆訓練模型,並觀察W和b的變化

  model= Model()

  # 收集W,b畫圖

  Ws, bs = [], []

  for epoch in range(10):

  Ws.append(model.W.numpy())

  bs.append(model.b.numpy())

  # 計算loss

  current_loss = loss(model(inputs), outputs)

  train(model, inputs, outputs, learning_rate=0.1)

  print('Epoch %2d: W=%1.2f b=%1.2f, loss=%2.5f' %

  (epoch, Ws[-1], bs[-1], current_loss))

  # 畫圖

  # Let's plot it all

  epochs = range(10)

  plt.plot(epochs, Ws, 'r',

  epochs, bs, 'b')

  plt.plot([TRUE_W] * len(epochs), 'r--',

  [TRUE_b] * len(epochs), 'b--')

  plt.legend(['W', 'b', 'true W', 'true_b'])

  plt.show()

  Epoch 0: W=5.00 b=0.00, loss=8.76355

  Epoch 1: W=4.61 b=0.40, loss=5.97410

  Epoch 2: W=4.30 b=0.72, loss=4.18118

  Epoch 3: W=4.05 b=0.98, loss=3.02875

  Epoch 4: W=3.85 b=1.18, loss=2.28800

  Epoch 5: W=3.69 b=1.35, loss=1.81184

  Epoch 6: W=3.56 b=1.48, loss=1.50577

  Epoch 7: W=3.46 b=1.58, loss=1.30901

  Epoch 8: W=3.38 b=1.67, loss=1.18253

  Epoch 9: W=3.31 b=1.73, loss=1.10123

  

在這裏插入圖片描述
相關文章
相關標籤/搜索