TensorFlow 基礎系列 - 1


TensorFlow 基礎系列


學習目的

瞭解機器學習的一些基礎功能,一些基礎用法,然後在我們的實際工作中創造出更多的火花。

環境準備

環境話有很多,我在學習的這個慕課的實驗室、谷歌實驗室。還有騰訊實驗室都可以用來做,也非常方便,本地環境搭建也是非常的方便,但是在訓練數據多的時候,那就非常的慢。

這些實驗室提供強大的算力,最主要的還是免費。

  • https://ot.icourse163.org/#/lab
  • https://colab.research.google.com/notebooks/intro.ipynb

實例

定義神經網絡的框架叫做keras,它將神經元網絡模型定義爲一組Sequential層。Keras庫也需要導入。

然後我們導入一個名爲numpy的庫,它可以幫助我們方便快捷地將數據表示爲列表

在編譯神經網絡時,我們必須指定2個函數:一個損失函數和一個優化器。

如果我們讀過很多有關機器學習的數學理論,這裏通常是用到它們的地方。但Tensorflow將這些數學很好地封裝在函數中供我們使用。那麼這個程序裏到底發生了什麼?我們來看一下:

我們知道,在上面的函數中,兩組數字之間的關係其實是y=2x-1。當計算機試圖 "學習 "這個映射關係時,它猜測......也許y=10x+10。LOSS(損失)函數將猜測的答案與已知的正確答案進行比較,並衡量偏差程度。然後,計算機使用OPTIMIZER函數再做一次猜測,努力使損失最小化。這時,也許計算機會得出一些像y=5x+5這樣的結果,雖然還是很糟糕,但更接近正確的結果(即損失更低)。訓練的時候,將依據指定的EPOCHS次數,重複這樣的猜測與優化過程。

下面的程序中可以看到如何設置用 "平均平方誤差 "來計算損失,並使用 "同步梯度下降 "來優化神經元網絡。我們並不需要理解背後的這些數學,但我們可以看到它們的成效!

隨着經驗的積累,我們將瞭解如何選擇相應的損失和優化函數,以適應不同的情況。

在調用model.fit函數時,神經網絡“學習”X和Y之間的關係。在這個過程中,它將一次又一次地完成上面所說的循環,即做一個猜測,衡量它有多好或多壞(又名損失),使用Opimizer進行再一次猜測,如此往復。訓練將根據指定的遍數(epochs)執行此操作。當運行此代碼時,將在輸出結果中看到損失(loss)。

from tensorflow import keras
import numpy as np

## 構建模型
## layer就是一層神經元, shape就是一個輸入值, 接下來我們將創建一個最簡單的神經網絡。它只有1層,且這層只有1個神經元,它的輸入只是1個數值
model = keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])

## 優化和損失函數
model.compile(optimizer='sgd', loss='mean_squared_error')

## 準備訓練數據
xs = np.array([-1.00.01.02.03.04.0], dtype=float) # tf擅長處理float數據
ys = np.array([-3.0-1.01.03.05.07.0], dtype=float)


## 訓練模型
model.fit(xs, ys, epochs=500# y是標籤,eposhs是訓練次數,這裏是100次

到這裏爲止模型已經訓練好了,它學習了X和Y之間的關係。現在,我們可以使用model.predict方法來讓它計算未知X對應的Y。例如,如果X=10,我們認爲Y會是什麼?在運行下面代碼之前,請猜一猜:

model.predict([10.0])
## 18.980xxx 接近於19

我們可能會想到19,對吧?但最後輸出比19低了一丁點兒。這是爲什麼呢?因爲神經網絡處理的是概率,所以根據我們向神經元網絡提供的數據,它計算出X和y之間的關係是y=2x-1的概率非常高。但由於只有6個數據點,無法完全確定x和y的函數關係。因此,10對應的y值非常接近19,但不一定正好是19。當使用神經網絡時,會看到這種模式反覆出現。我們幾乎總是在處理概率,而非確定的數值。並經常需要通過進一步編寫程序,來找出概率所對應的結果,特別當處理分類問題時。

如果是訓練 1500 次的話,結果更準確。


本文分享自微信公衆號 - 程序員匯聚地(chasays)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章