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