如何使用TensorFlow構建機器學習模型
TensorFlow 是一個由谷歌開發的庫,并在 2015 年開源,它能使構建和訓練機器學習模型變得簡單。
我們接下來要建立的模型將能夠自動將公里轉換為英里,在本例中,我們將創建一個能夠學習如何進行這種轉換的模型。我們將向這個模型提供一個 CSV (https://en.wikipedia.org/wiki/Comma-separated_values)文件作為輸入,其中有 29 組已經執行過的公里和英里之間的轉換,基于這些數據,我們的模型將學會自動進行這種轉換。
我們將使用有監督學習算法,因為我們知道數據的輸入和輸出結果。并使用 Python 作為編程語言。Python 提供了一系列與機器學習相關的方便的庫和工具。本例中所有的步驟都是使用 Google Colab 執行的。Google Colab 允許我們在瀏覽器上零配置地編寫和執行 Python 代碼。
導入必需的庫
我們首先導入在我們的例子中將要使用到的庫。
- import tensorflow as tf
- import pandas as pd
- import seaborn as sns
- import matplotlib.pyplot as plt
- 我們將導入 TensorFlow 來創建我們的機器學習模型。
- 我們還將導入 Pandas 庫來讀取包含有公里和英里轉換數據的 CSV 文件。
- 最后,我們將導入 Seaborn 和 Matlotlib 庫繪制不同的結果。
加載樣例數據
我們將含有逗號分隔的值的文件(Kilometres-miles.csv)讀取到我們的數據幀中。這個文件包含一系列公里和英里值的轉換。我們將使用這些數據幀來訓練我們的模型。你可以在這個鏈接(https://drive.google.com/file/d/1m63pJA-zUAA12XOCCBt3Aik9fnjrj_8s/view?usp=sharing)下載這個文件。
要從 Google Colab 讀取文件,你可以使用不同的方法。在本例中,我直接將 CSV 文件上傳到我的 Google Colab 上的 sample_data 文件夾中,但你可以從一個 URL 中讀取文件(比如,從 GitHub)。
上傳到 Google Colab 的問題是,數據會在運行時重啟時丟失。
數據幀是二維的大小可變的并且各種各樣的表格數據。
- df = pd.read_csv('/content/sample_data/Kilometres-miles.csv')
- df.info
示例數據信息
繪制數據幀
我們將“searborn”庫的“scatterplot”導入并命名為“sns”,然后使用這個庫來繪制上述圖形。它顯示了 X(公里)和 Y(英里)對應關系的圖形化表示。
- print("Painting the correlations")
- #Once we load seaborn into the session, everytime a matplotlib plot is executed, seaborn's default customizations are added
- sns.scatterplot(df['Kilometres'], df['Miles'])
- plt.show()
公里和英里的相關性
我們定義數據幀的輸入和輸出來訓練模型:
X(公里)是輸入,Y(英里)是輸出。
- print("Define input(X) and output(Y) variables")
- X_train=df['Kilometres']
- y_train=df['Miles']
創建神經網絡
現在,讓我們使用“keras.Sequential”方法來創建一個神經網絡,其中依次添加“layers”。每一個層(layer)都具有逐步提取輸入數據以獲得所需輸出的功能。Keras 是一個用 Python 寫的庫,我們創建神經網絡并使用不同的機器學習框架,例如 TensorFlow。
接下來,我們將使用“add”方法向模型添加一個層。
- print("Creating the model")
- model = tf.keras.Sequential()
- model.add(tf.keras.layers.Dense(units=1,input_shape=[1]))
創建神經網絡
編譯模型
在訓練我們的模型之前,我們將在編譯步驟中添加一些額外設置。
我們將設置一個優化器和損失函數,它們會測量我們的模型的準確性。Adam 優化是一種基于第一次和第二次矩的自適應預算的隨機梯度下降算法。
為此,我們將使用基于平均方差的損失函數,它測量了我們預測的平均方差。
我們的模型的目標是最小化這個函數。
- print("Compiling the model")
- model.compile(optimizer=tf.keras.optimizers.Adam(1), loss='mean_squared_error')
訓練模型
我們將使用“擬合(fit)”方法來訓練我們的模型。首先,我們傳入獨立變量或輸入變量(X-Kilometers)和目標變量(Y-Miles)。
另一方面,我們預測 epoch 的數值。在本例中,epoch 值是 250。一個 epoch 就是遍歷一遍所提供的完整的 X 和 Y 數據。
- 如果 epoch 的數值越小,誤差就會越大;反過來,epoch 的數值越大,則誤差就會越小。
- 如果 epoch 的數值越大,算法的執行速度就會越慢。
- print ("Training the model")
- epochs_hist = model.fit(X_train, y_train, epochs = 250)
訓練模型的控制臺
評估模型
現在,我們評估創建的模型,在該模型中,我們可以觀察到損失(Training_loss)隨著執行的遍歷次數(epoch)的增多而減少,如果訓練集數據有意義并且是一個足夠大的組,這是合乎邏輯的。
- print("Evaluating the model")
- print(epochs_hist.history.keys())
- #graph
- plt.plot(epochs_hist.history['loss'])
- plt.title('Evolution of the error associated with the model')
- plt.xlabel('Epoch')
- plt.ylabel('Training Loss')
- plt.legend('Training Loss')
- plt.show()
從圖中我們可以看出,用 250 次訓練模型并沒有多大幫助,在第 50 次遍歷后,誤差并沒有減少。因此,訓練該算法的最佳遍歷數大約是 50。
進行預測
現在我們已經訓練了我們的模型,我們可以使用它來進行預測。
在本例中,我們將 100 賦值給模型的輸入變量,然后模型會返回預測的英里數:
- kilometers = 100
- predictedMiles = model.predict([kilometers])
- print("The conversion from Kilometres to Miles is as follows: " + str(predictedMiles))
從公里到英里的換算為 62.133785。
檢查結果
- milesByFormula = kilometers * 0.6214
- print("The conversion from kilometers to miles using the mathematical formula is as follows:" + str(milesByFormula))
- diference = milesByFormula - predictedMiles
- print("Prediction error:" + str(diference))
使用公式從公里到英里的換算值為:62.13999999999999。預測誤差為 0.00621414。
總結
通過本例,我們了解了如何使用 TensorFlow 庫來創建一個模型,這個模型已經學會自動將公里數轉換為英里數,并且誤差很小。
TensorFlow 用于執行此過程的數學非常簡單?;旧希纠褂镁€性回歸來創建模型,因為輸入變量(公里數)和輸出變量(英里數)是線性相關的。在機器學習中,過程中最耗時的部分通常是準備數據。
隨著時間的推移,我們收獲了一些經驗,這些經驗可以幫助我們選擇最適合的算法及其設置,但一般來說,這是一項分析測試并改進的任務。