文章類型:翻譯
文章內容:
- 1、完整的神經網絡源代碼
- 2、加載 Iris CSV數據到Tensorflow
- 3、構建深度神經網絡分類器
- 4、數據輸入管道
- 5、利用 Iris data擬合神經網絡分類器
- 6、評估神經網絡分類器的準確性
- 7、對新樣本進行分類
- 8、其他資源
前沿
Tensorflow的高級機器學習API(tf.estimator)使得配置、訓練和評估各種機器學習模型更加的簡單。在本教程中,你將使用tf.estimator構建一個神經網絡分類器,用于訓練 Iris data,構建一個預測 Iris flower的模型,并預測新的Iris flower。你將編寫代碼完成以下五個步驟:
1、將包含訓練集和測試集的CSV數據加載到Tensorflow Dataset 2、構建神經網絡模型分類器 3、利用訓練數據訓練模型 4、評估模型的精度 5、分類新的樣本
注意:在學習本教程之前,請在您的機器上安裝Tensorflow。
一、完整的神經網絡源代碼
以下是神經網絡分類器的完整代碼:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os
import urllib
import numpy as np
import tensorflow as tf
# Data sets
IRIS_TRAINING = "iris_training.csv"
IRIS_TRAINING_URL = "http://download.tensorflow.org/data/iris_training.csv"
IRIS_TEST = "iris_test.csv"
IRIS_TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"
def main():
# If the training and test sets aren't stored locally, download them.
if not os.path.exists(IRIS_TRAINING):
raw = urllib.urlopen(IRIS_TRAINING_URL).read()
with open(IRIS_TRAINING, "w") as f:
f.write(raw)
if not os.path.exists(IRIS_TEST):
raw = urllib.urlopen(IRIS_TEST_URL).read()
with open(IRIS_TEST, "w") as f:
f.write(raw)
# 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.feature_column.numeric_column("x", shape=[4])]
# Build 3 layer DNN with 10, 20, 10 units respectively.
classifier = tf.estimator.DNNClassifier(feature_columns=feature_columns,
hidden_units=[10, 20, 10],
n_classes=3,
model_dir="/tmp/iris_model")
# Define the training inputs
train_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": np.array(training_set.data)},
y=np.array(training_set.target),
num_epochs=None,
shuffle=True)
# Train model.
classifier.train(input_fn=train_input_fn, steps=2000)
# Define the test inputs
test_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": np.array(test_set.data)},
y=np.array(test_set.target),
num_epochs=1,
shuffle=False)
# Evaluate accuracy.
accuracy_score = classifier.evaluate(input_fn=test_input_fn)["accuracy"]
print("\nTest Accuracy: {0:f}\n".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=np.float32)
predict_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": new_samples},
num_epochs=1,
shuffle=False)
predictions = list(classifier.predict(input_fn=predict_input_fn))
predicted_classes = [p["classes"] for p in predictions]
print("New Samples, Class Predictions: {}\n".format(predicted_classes))
if __name__ == "__main__":
main()
二、加載Iris CSV數據到Tensorflow
在這個教程中,Iris 數據被隨機分成兩部分:
- 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 os
import urllib
import tensorflow as tf
import numpy as np
IRIS_TRAINING = "iris_training.csv"
IRIS_TRAINING_URL = "http://download.tensorflow.org/data/iris_training.csv"
IRIS_TEST = "iris_test.csv"
IRIS_TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"
然后,如果訓練集和測試集并不存在本地,那么就下載它們。
if not os.path.exists(IRIS_TRAINING):
raw = urllib.urlopen(IRIS_TRAINING_URL).read()
with open(IRIS_TRAINING,'w') as f:
f.write(raw)
if not os.path.exists(IRIS_TEST):
raw = urllib.urlopen(IRIS_TEST_URL).read()
with open(IRIS_TEST,'w') as f:
f.write(raw)
接下來,使用模塊learn.datasets.base
中的load_csv_with_header()
加載訓練集和測試集到 Datasets,該模塊包含三個必須的參數:
1、filename,它將文件路徑轉化為CSV文件。 2、target_dtype,獲取數據集目標值的numpy datatype。 3、feature_dtype,獲取訓練集特征值的numpy datatype。
此處,target表示花的種類,它是[0, 2]之間的整數,所以 target_dtype
為 np.int
。
# 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)
Datasets in tf.contrib.learn
are named tuples;你可以通過data and target field 訪問特征數據和目標數據。此處,training_set.data
和 training_set.target
包含了訓練集的特征數據和目標數據;test_set.data
和test_set.target
包含測試集的特征數據和目標數據。
稍后,在利用 Iris data擬合神經網絡分類器中看到training_set.data
和training_set.target
訓練你的模型。在評估神經網絡分類器的準確性中,你將使用test_set.data
和test_set.target
。但是首先,在下一節中你要構建你的模型。
三、構建深度神經網絡分類器
tf.estimator
提供了很多各種預定義的模型,稱之為“Estimator”,利用它你可以在數據集之上進行訓練和評估。在此部分,你將配置深度神經網絡分類器模型去擬合Iris數據。使用tf.estimator
,你可以實例化tf.estimator.DNNClassifier
,只需要幾行代碼就可以搞定。
# Specify that all features have real-value data
feature_columns = [tf.feature_column.numeric_column("x", shape=[4])]
# Build 3 layer DNN with 10, 20, 10 units respectively
classifier = tf.estimator.DNNClassifier(feature_columns = feature_columns,
hidden_units = [10, 20, 10],
n_classes = 3,
model_dir = "/tmp/iris_model")
上面的代碼首先定義了模型的特征列,為數據集中特征指定了數據類型。所有的特征數據都是連續的,所以 tf.feature_column.numeric_column
(該函數返回一個實數列)是構建特征數據非常合適的函數。在數據集中總共有四個特征(sepal width,sepal height,petal width,petal height)
,所以形狀必須被設置為 [4]
來保存所有的數據。
然后,創建DNNClassifier模型需要用到以下參數:
1、feature_columns = feature_columns。設置特征列。 2、hidden_units = [10, 20, 10]。設置隱含層。 3、n_classes = 3。表示三個目標分類 4、model_dir = "/tmp/iris_model" ,存儲checkpoint數據和TensorBoard summaries數據的目錄
四、數據輸入管道
tf.estimator API
使用input 函數,這個將創建一個Tensorflow操作用于為模型產生數據。我們使用 tf.estimator.inputs.numpy_input_fn
產生 input 的管道。
# Define the training inputs
train_input_fn = tf.estimator.inputs.numpy_input_fn(
x = {"x": np.array(training_set.data)},
y = np.array(training_set.target),
num_epochs = None,
shuffle = True)
五、利用 Iris data擬合神經網絡分類器
現在你可以配置DNN 分類器的模型了,你可以把模型放在訓練集上進行訓練。訓練的步數為2000次
# Train model
classifier.train(input_fn = train_input_fn, steps = 2000)
模型的狀態保存在分類器中,也就是說,如果你喜歡的話,你可以反復訓練。例如,以下的訓練方式是等效的。
classifier.train(input_fn = train_input_fn, steps = 1000)
classifier.tarin(input_fn = train_input_fn, steps = 1000)
不管怎么樣,如果你想在訓練過程中追蹤模型,你可以需要使用TensorFlow SessionRunHook
來執行日志操作。
六、評估神經網絡分類器的準確性
以下代碼表示在測試集上評估模型的精度。
# Define the test inputs
test_input_fn = tf.estimator.inputs.numpy_input_fn(
x = {"x": np.array(test_set.data)},
y = np.array(test_set.target),
num_epochs = 1,
shuffle = False)
# Evaluate accuracy
accuracy_score = classifier.evaluate(input_fn = test_input_fn)["accuracy"]
print "\nTest Accuracy: {0:f}\n".format(accuracy_score)
注意:這里的num_epochs = 1
的參數非常重要。test_input_fn
將迭代數據集一次,然后發送 OutOfRangeError
。這個錯誤信號標志著分類器停止評估,所以它會對輸入進行一次評估。
當你運行整個腳本的時候,會打印如下數據:
Test Accuracy: 0.966667
你的準確性可能會有所不同,但應該會高于90%。這對于一個較小的數據集而言并不壞。
七、對新樣本進行分類
使用estimator
的 predict()
方法可以分類新的樣本。例如,以下有兩個新樣本。
使用predict()
函數會返回一個dicts,它可以很簡單的轉化為list,下面的代碼檢索并打印出結果。
# 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 = np.float32)
predict_input_fn = tf.estimator.inputs.numpy_input_fn(
x = {"x": new_samples},
num_epochs = 1,
shuffle = False)
predictions = list(classifier.predict(input_fn = predict_input_fn))
predicted_classes = [p["classes"] for p in predictions]
print "New Samples, Class Preditions: {}\n".format(predicted_classes)
所得的結果如下:
New Samples, Class Predictions: [1 2]
因此該模型預測的第一個樣本為Iris versicolor
,第二個樣本是Iris virginica
。
八、其他資源
- 1、想學習更多利用tf.estimator創建線性模型,可以查看Large-scale Linear Models with TensorFlow.
- 2、想利用tf.estimator APIs建立你自己的Estimator,可以查看Creating Estimators in tf.estimator.
- 3、如果想在瀏覽器中進行神經網絡的建模和可視化,可以參考:Deep Playground.
- 4、如果想查看更多關于神經網絡的高級教程,可以參考: Convolutional Neural Networks和Recurrent Neural Networks.