文章類型:翻譯
文章內(nèi)容:
- 1斤彼、完整的神經(jīng)網(wǎng)絡(luò)源代碼
- 2、加載 Iris CSV數(shù)據(jù)到Tensorflow
- 3骄恶、構(gòu)建深度神經(jīng)網(wǎng)絡(luò)分類器
- 4、數(shù)據(jù)輸入管道
- 5匕垫、利用 Iris data擬合神經(jīng)網(wǎng)絡(luò)分類器
- 6僧鲁、評(píng)估神經(jīng)網(wǎng)絡(luò)分類器的準(zhǔn)確性
- 7、對(duì)新樣本進(jìn)行分類
- 8年缎、其他資源
前沿
Tensorflow的高級(jí)機(jī)器學(xué)習(xí)API(tf.estimator)使得配置悔捶、訓(xùn)練和評(píng)估各種機(jī)器學(xué)習(xí)模型更加的簡(jiǎn)單。在本教程中单芜,你將使用tf.estimator構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)分類器,用于訓(xùn)練 Iris data犁柜,構(gòu)建一個(gè)預(yù)測(cè) Iris flower的模型洲鸠,并預(yù)測(cè)新的Iris flower。你將編寫代碼完成以下五個(gè)步驟:
1馋缅、將包含訓(xùn)練集和測(cè)試集的CSV數(shù)據(jù)加載到Tensorflow Dataset 2扒腕、構(gòu)建神經(jīng)網(wǎng)絡(luò)模型分類器 3、利用訓(xùn)練數(shù)據(jù)訓(xùn)練模型 4萤悴、評(píng)估模型的精度 5瘾腰、分類新的樣本
注意:在學(xué)習(xí)本教程之前,請(qǐng)?jiān)谀臋C(jī)器上安裝Tensorflow覆履。
一蹋盆、完整的神經(jīng)網(wǎng)絡(luò)源代碼
以下是神經(jīng)網(wǎng)絡(luò)分類器的完整代碼:
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數(shù)據(jù)到Tensorflow
在這個(gè)教程中硝全,Iris 數(shù)據(jù)被隨機(jī)分成兩部分:
- 1栖雾、120個(gè)樣本的訓(xùn)練集(iris_training.csv)
- 2、30個(gè)樣本的測(cè)試集(iris_test.csv)
開(kāi)始伟众,要加載必要的模塊析藕,然后定義在哪里去下載并保存數(shù)據(jù)集
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"
然后,如果訓(xùn)練集和測(cè)試集并不存在本地凳厢,那么就下載它們账胧。
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)
接下來(lái)竞慢,使用模塊learn.datasets.base
中的load_csv_with_header()
加載訓(xùn)練集和測(cè)試集到 Datasets,該模塊包含三個(gè)必須的參數(shù):
1治泥、filename筹煮,它將文件路徑轉(zhuǎn)化為CSV文件。 2车摄、target_dtype寺谤,獲取數(shù)據(jù)集目標(biāo)值的numpy datatype。 3吮播、feature_dtype变屁,獲取訓(xùn)練集特征值的numpy datatype。
此處意狠,target表示花的種類粟关,它是[0, 2]之間的整數(shù),所以 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闷板;你可以通過(guò)data and target field 訪問(wèn)特征數(shù)據(jù)和目標(biāo)數(shù)據(jù)。此處院塞,training_set.data
和 training_set.target
包含了訓(xùn)練集的特征數(shù)據(jù)和目標(biāo)數(shù)據(jù)遮晚;test_set.data
和test_set.target
包含測(cè)試集的特征數(shù)據(jù)和目標(biāo)數(shù)據(jù)。
稍后拦止,在利用 Iris data擬合神經(jīng)網(wǎng)絡(luò)分類器中看到training_set.data
和training_set.target
訓(xùn)練你的模型县遣。在評(píng)估神經(jīng)網(wǎng)絡(luò)分類器的準(zhǔn)確性中,你將使用test_set.data
和test_set.target
汹族。但是首先萧求,在下一節(jié)中你要構(gòu)建你的模型。
三顶瞒、構(gòu)建深度神經(jīng)網(wǎng)絡(luò)分類器
tf.estimator
提供了很多各種預(yù)定義的模型夸政,稱之為“Estimator”,利用它你可以在數(shù)據(jù)集之上進(jìn)行訓(xùn)練和評(píng)估榴徐。在此部分守问,你將配置深度神經(jīng)網(wǎng)絡(luò)分類器模型去擬合Iris數(shù)據(jù)。使用tf.estimator
箕速,你可以實(shí)例化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")
上面的代碼首先定義了模型的特征列盐茎,為數(shù)據(jù)集中特征指定了數(shù)據(jù)類型兴垦。所有的特征數(shù)據(jù)都是連續(xù)的,所以 tf.feature_column.numeric_column
(該函數(shù)返回一個(gè)實(shí)數(shù)列)是構(gòu)建特征數(shù)據(jù)非常合適的函數(shù)。在數(shù)據(jù)集中總共有四個(gè)特征(sepal width探越,sepal height狡赐,petal width,petal height)
钦幔,所以形狀必須被設(shè)置為 [4]
來(lái)保存所有的數(shù)據(jù)枕屉。
然后,創(chuàng)建DNNClassifier模型需要用到以下參數(shù):
1鲤氢、feature_columns = feature_columns搀擂。設(shè)置特征列。 2卷玉、hidden_units = [10, 20, 10]哨颂。設(shè)置隱含層。 3相种、n_classes = 3威恼。表示三個(gè)目標(biāo)分類 4、model_dir = "/tmp/iris_model" 寝并,存儲(chǔ)checkpoint數(shù)據(jù)和TensorBoard summaries數(shù)據(jù)的目錄
四箫措、數(shù)據(jù)輸入管道
tf.estimator API
使用input 函數(shù),這個(gè)將創(chuàng)建一個(gè)Tensorflow操作用于為模型產(chǎn)生數(shù)據(jù)衬潦。我們使用 tf.estimator.inputs.numpy_input_fn
產(chǎn)生 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擬合神經(jīng)網(wǎng)絡(luò)分類器
現(xiàn)在你可以配置DNN 分類器的模型了镀岛,你可以把模型放在訓(xùn)練集上進(jìn)行訓(xùn)練附迷。訓(xùn)練的步數(shù)為2000次
# Train model
classifier.train(input_fn = train_input_fn, steps = 2000)
模型的狀態(tài)保存在分類器中,也就是說(shuō)哎媚,如果你喜歡的話,你可以反復(fù)訓(xùn)練喊儡。例如拨与,以下的訓(xùn)練方式是等效的。
classifier.train(input_fn = train_input_fn, steps = 1000)
classifier.tarin(input_fn = train_input_fn, steps = 1000)
不管怎么樣艾猜,如果你想在訓(xùn)練過(guò)程中追蹤模型买喧,你可以需要使用TensorFlow SessionRunHook
來(lái)執(zhí)行日志操作。
六匆赃、評(píng)估神經(jīng)網(wǎng)絡(luò)分類器的準(zhǔn)確性
以下代碼表示在測(cè)試集上評(píng)估模型的精度淤毛。
# 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
的參數(shù)非常重要。test_input_fn
將迭代數(shù)據(jù)集一次算柳,然后發(fā)送 OutOfRangeError
低淡。這個(gè)錯(cuò)誤信號(hào)標(biāo)志著分類器停止評(píng)估,所以它會(huì)對(duì)輸入進(jìn)行一次評(píng)估。
當(dāng)你運(yùn)行整個(gè)腳本的時(shí)候蔗蹋,會(huì)打印如下數(shù)據(jù):
Test Accuracy: 0.966667
你的準(zhǔn)確性可能會(huì)有所不同何荚,但應(yīng)該會(huì)高于90%。這對(duì)于一個(gè)較小的數(shù)據(jù)集而言并不壞猪杭。
七餐塘、對(duì)新樣本進(jìn)行分類
使用estimator
的 predict()
方法可以分類新的樣本。例如皂吮,以下有兩個(gè)新樣本戒傻。
使用predict()
函數(shù)會(huì)返回一個(gè)dicts,它可以很簡(jiǎn)單的轉(zhuǎn)化為list蜂筹,下面的代碼檢索并打印出結(jié)果需纳。
# 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)
所得的結(jié)果如下:
New Samples, Class Predictions: [1 2]
因此該模型預(yù)測(cè)的第一個(gè)樣本為Iris versicolor
,第二個(gè)樣本是Iris virginica
狂票。
八候齿、其他資源
- 1、想學(xué)習(xí)更多利用tf.estimator創(chuàng)建線性模型闺属,可以查看Large-scale Linear Models with TensorFlow.
- 2慌盯、想利用tf.estimator APIs建立你自己的Estimator,可以查看Creating Estimators in tf.estimator.
- 3掂器、如果想在瀏覽器中進(jìn)行神經(jīng)網(wǎng)絡(luò)的建模和可視化亚皂,可以參考:Deep Playground.
- 4、如果想查看更多關(guān)于神經(jīng)網(wǎng)絡(luò)的高級(jí)教程国瓮,可以參考: Convolutional Neural Networks和Recurrent Neural Networks.