1. 程式人生 > 其它 >一文初探Tensorflow高階API使用(初學者篇)

一文初探Tensorflow高階API使用(初學者篇)

今天我們要向Tensorflow高階API的學習門檻邁進一步。別聽到高階API就覺得是難度高的意思,其實高階API恰恰是為了降低大家的編碼難度而設定的。Tensorflow更高層的API使得配置,訓練,評估多種多樣的機器學習模型更簡單方便了。

本文將使用高層API:tf.contrib.learn 來構建一個分類神經網路,將它放在“鳶尾花資料集”上進行訓練,並且估計模型,使得模型能根據特徵(萼片和花瓣幾何形狀)預測出花的種類。

01 載入鳶尾花資料到TensorFlow上

首先介紹一下我們今天要使用的資料集:

鳶尾花資料集:Iris data set 由150個樣本組成。其中,總共有3個類別:山鳶尾(Iris setosa),虹膜錦葵(Iris virginica),變色鳶尾 (Iris versicolor) ,每個類別50個樣本。

下圖,從左到右分別是 Iris setosa , Iris versicolor, and Iris virginica三類花的圖片:

資料的每一行(也就是每個樣本)包含了樣本的特徵與類別標籤。

特徵有:萼片的長度,萼片的寬度,花瓣的長度,花瓣的寬度。

類別標籤用整型數字表示:0表示萼片,1表示Iris versicolor,2表示Iris virginica

資料格式如下:

在機器學習的建模中,我們一般將資料集拆分成訓練集與測試集,訓練集用來訓練模型,測試集用來測試模型的泛化能力。所以此處,也將150個樣本的資料集隨機地拆分成兩個部分:

(1)訓練集包含120個樣本(放在iris_training.csv檔案中) (2)測試集包含30個樣本(放在iris_test.csv檔案中)

在開始寫程式之前,要先下載好這兩個資料集哦~

現在我們已經瞭解了資料集大概的樣子了,於是開始上程式碼嘍~

首先,還是先匯入要用的庫

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import tensorflow as tf
import numpy as np

接著,把下載好的訓練集與測試集根據它們的路徑載入的dataset中,使用的是learn.datasets.base中的load_csv_with_header()這個方法。這個方法需要傳入3個引數:

(1)filename:檔案路徑/檔名 (2)target_dtype:標籤類別的資料型別 (3)features_dtype:特徵的資料型別

# 定義資料集的路徑

IRIS_TRAINING = "iris_training.csv"

IRIS_TEST = "iris_test.csv"

# 載入資料集

# # 載入訓練集

training_set = tf.contrib.learn.datasets.base.load_csv_with_header(

filename=IRIS_TRAINING, target_dtype=np.int, features_dtype=np.float32)

# # 載入測試集 test_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename=IRIS_TEST, target_dtype=np.int, features_dtype=np.float32)

注意,載入建立後的Dataset是命名元組,可以使用training_set.data呼叫訓練資料集的特徵資料,使用training_set.target呼叫訓練資料集的類別標籤資料。對test_set的測試資料集也是同理。

02 構建深度神經網路分類模型

tf.contrib.learn提供了多種多樣的預定義模型,叫做Estimators(估計器),這些Estimator在你擬執行訓練與評估模型的操作的時候可以實現開箱即用,也就是說,當你要使用某個模型的時候,不再需要去寫他的內部邏輯,直接呼叫這個模型的介面,用一句程式碼搞定即可。

於是,這裡我們就來使用tf.contrib.learn配置一個深層神經網路的分類模型,只需要了了幾行程式碼~

# Specify that all features have real-value datafeature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]# Build 3 layer DNN with 10, 20, 10 units respectively.classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns, hidden_units=[10, 20, 10], n_classes=3, model_dir="/tmp/iris_model")

以上程式碼首先定義了模型的特徵列,並且指定了特徵資料的資料型別。在上一節中我們看到所有的特徵都是連續型變數,所以tf.contrib.layers.real_valued_column這個函式被用來構建特徵列。另外,我們的資料集中有4個特徵,故傳入引數dimension=4.

接著,以上程式碼使用了tf.contrib.learn.DNNClassifier這個函式來直接構建DNN模型。(記得前面兩個筆記,無論是講簡單的分類模型softmax regression還是稍微複雜的卷積神經網路,都是自己一層一層地去寫模型的邏輯結構,相當繁瑣,看!高階的API已經為我們封裝好了這些模型,我們只需要直接呼叫方法就行)

DNNClassifier這個方法需要傳入4個引數:

(1)feature_columns=feature_columns,將剛剛預先定義好的特徵列傳給引數feature_columns。

(2)hidden_units=[10, 20, 10],設定隱藏層中的神經元個數,這裡表示共有3個隱藏層,依次的神經元個數為10,20,10。

(3)n_classes=3,設定目標分類的個數,這個是3類,分成3種鳶尾花。

(4)model_dir=/tmp/iris_model,這是儲存模型訓練過程中的checkpoint檢查點的資料的路徑

03

模型擬合真實資料進行訓練

上面一步建立了一個模型,現在你可以將鳶尾花的訓練資料集利用fit()這個方法來擬合進模型。主要是通過傳入引數的方式,將訓練集中的特徵傳給x,將訓練集中的標籤傳給y,並且定義了訓練的次數(比如這裡是2000次):

# Fit modelclassifier.fit(x=training_set.data, y=training_set.target, steps=2000)

注意的是,模型的狀態會在訓練中被快取在分類器中classifier,所以你可以按照自己的喜好來分開迭代,例如,上面程式碼等同於下面兩句程式碼:

classifier.fit(x=training_set.data, y=training_set.target, steps=1000) classifier.fit(x=training_set.data, y=training_set.target, steps=1000)

04 評估模型的精度

第1步匯入了資料,第2步構建了模型,第3步在訓練集上進行了訓練學,現在第4步,我們要去評估訓練好的模型了。

評估模型的時候使用的是測試集,與.fit()方法相似,評估模型呼叫.evaluate()方法,並且將測試集的特徵傳入給x,測試集的標籤傳入給y,並且指定計算的是accuracy。

accuracy_score = classifier.evaluate(x=test_set.data, y=test_set.target)["accuracy"]print('Accuracy: {0:f}'.format(accuracy_score))

執行以上的所有程式碼,會打印出最後的精度:

Accuracy: 0.966667

每次訓練的accuracy可能會有點不相同,但都應該是在90%之上的哈~

05 預測新的資料

模型建好了,也通過了評估,現在終於到了用武之時呢~我們要用模型與預測新的資料。

比如,現在新來了兩條未知的資料,至知道這兩朵花的4個特徵,卻不知道它們的種類,於是呼叫.predict()方法進行預測:

# 新的兩個樣本new_samples = np.array( [[6.4, 3.2, 4.5, 1.5], [5.8, 3.1, 5.0, 1.7]], dtype=float)# 預測 y = list(classifier.predict(new_samples, as_iterable=True))# 列印print('Predictions: {}'.format(str(y)))

.predict()返回的是一個數組,預測的結果打印出來應是如下,第一個樣本為1類,第二哥贗本為二類。

Prediction: [1 2]

將以上程式碼所有整合在一起如下:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import tensorflow as tf
import numpy as np
# Data sets
IRIS_TRAINING = "iris_training.csv"
IRIS_TEST = "iris_test.csv"
# Load datasets.training_set = tf.contrib.learn.datasets.base.load_csv_with_header(     filename=IRIS_TRAINING,     target_dtype=np.int,     features_dtype=np.float32) test_set = tf.contrib.learn.datasets.base.load_csv_with_header(     filename=IRIS_TEST,     target_dtype=np.int,     features_dtype=np.float32)
# Specify that all features have real-value data
feature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]# Build 3 layer DNN with 10, 20, 10 units respectively.
classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,                                             hidden_units=[10, 20, 10],                                             n_classes=3,                                             model_dir="/tmp/iris_model")
# Fit model.classifier.fit(x=training_set.data,                y=training_set.target,                steps=2000)
# Evaluate accuracy.accuracy_score = classifier.evaluate(x=test_set.data,                                      y=test_set.target)["accuracy"] print('Accuracy: {0:f}'.format(accuracy_score))
# Classify two new flower samples.new_samples = np.array(     [[6.4, 3.2, 4.5, 1.5], [5.8, 3.1, 5.0, 1.7]], dtype=float) y = list(classifier.predict(new_samples, as_iterable=True)) print('Predictions: {}'.format(str(y)))

tf.contrib.learn包括了各種型別的深度學習和機器學習的演算法。它是從Tensorflow官方Scikit Flow直接遷移過來的,其使用的風格與Scikit-learn相似(用python寫機器學習的小夥伴應該很熟悉)。

從Tensorflowv0.9版本時候,tf.learn已經能夠無縫與其他contrib模型結合起來使用啦~