tf.estimator Quickstart解讀

tf.estimator Quickstart解讀
https://www.tensorflow.org/get_started/estimator


把代碼拷下來,放到eclipse的環境中,並不能編譯成功。
主要改爲兩個地方:
第一:升級了下tensorflow的版本,由1.2升到了1.3,tensorflow升級比較快。
第二:import urllib改爲 import urllib.request,代碼中用到urllib的地方也改爲urllib.request,畢竟這是window7的python3.5的版本。
第三:把open的方式由“w”改爲“wb”
跑出的結果:
Test Accuracy: 0.966667
New Samples, Class Predictions:    [array([b'1'], dtype=object), array([b'2'], dtype=object)]
同時當前文件並列的,會下到iris_training.csv和iris_test.csv。當然你至少得訪問到tensorflow的官網。


下面假設你已成功跑完,簡單過一下代碼。代碼參見https://www.tensorflow.org/get_started/estimator
打開iris_training.csv看看,只有120個樣本,就能到96.6%的水平,不錯啊。
測試樣本30個。
樣本來自3類植物,長得倒很象。每類50個樣本。樣本被打亂。
Iris setosa, 
Iris virginica, 
Iris versicolor.
csv的表頭具有迷惑性,不看網頁很容易不解。其實,csv的五列與表頭沒啥關係。這五列真正的表頭是:
萼片長,萼片寬,花瓣長,花瓣寬,類別。
類別是上面三類Iris,分別用0,1,2表示。
注意csv的頭有固定的格式,第一個數指120個樣本,第二個數指4個特徵(features),這兩個東西在load_csv_with_header方法中會用來構造shape.
training_set = tf.contrib.learn.datasets.base.load_csv_with_header(......)
training_set通過load_csv_with_header加載後,training_set.data放特徵數據,training_set.target放預測值。這個概念後面會用。
Estimator: 預定義的模型。
下面構造模型:
feature_columns = [tf.feature_column.numeric_column("x", shape=[4])]
‘x’是key,因爲表中有萼片長,萼片寬等四個特徵,所以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")
feature_columns=feature_columns:四個特徵列。
hidden_units=[10, 20, 10]:三個隱藏層,神經元個數分別爲10個,20個,10個。
n_classes=3:3類植物
model_dir=/tmp/iris_model:指定一個目錄,用來存放檢查點。
用estimator顯然比原來那個mnist_deep.py的代碼少多了,幾個參數一裝配,歐了。
    # 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)
這裏有個小知識,提一下:
epochs指訓練過程中數據將被“輪”多少次,train時沒指定,但test_input_fn時它指定了1次。
例子:樣本量爲1000,batchsize=100,經過10個批次,就完成1個epochs(一輪)。
定義訓練參數的輸入管道,不然train時沒參數。
    classifier.train(input_fn=train_input_fn, steps=2000)
使用classifier這個模型和csv的數據訓練。這個方法不太好跟蹤訓練過程,後面會介紹SessionRunHook,這個以後再說。
classifier自帶evaluate方法。當然,即然有train方法,當然會有evaluate方法。好人做到底,送佛送到西了。
下一句:accuracy_score = classifier.evaluate(input_fn=test_input_fn)["accuracy"]
想看下evaluate返回的dict到底有些啥東西,所以在這句之前加一句:
tmp = classifier.evaluate(input_fn=test_input_fn);
做個斷點看看,結果tmp爲:
dict: {'loss': 2.3112736, 'average_loss': 0.077042453, 'accuracy': 0.96666664, 'global_step': 8000}
accuracy_score不過把accuracy拿出來了。如有需要,還可以看看字段的。
再後面,給個兩個臨時樣本:
[[6.4, 3.2, 4.5, 1.5],[5.8, 3.1, 5.0, 1.7]
看看屬於哪類植物。
此時classifier經過了train和test,我們認爲它可以出山啦。並且它自帶一個predict方法,三個階段分得很清楚嘛。
predictions = list(classifier.predict(input_fn=predict_input_fn))
predictions運算完成後內部是這樣的:
<class 'list'>: 
[{'class_ids': array([1], dtype=int64), 'classes': array([b'1'], dtype=object), 'logits': array([-5.04032564,  6.55079699, -7.03252172], dtype=float32), 'probabilities': array([  9.24772212e-06,   9.99989390e-01,   1.26134830e-06], dtype=float32)}, 
{'class_ids': array([1], dtype=int64), 'classes': array([b'1'], dtype=object), 'logits': array([-10.27748394,   1.46430922,   0.92295957], dtype=float32), 'probabilities': array([  5.02812372e-06,   6.32123172e-01,   3.67871851e-01], dtype=float32)}]
下面這句就好理解了:
predicted_classespredicted_classes = [p["classes"] for p in predictions]
小結:
tf.estimator就是已經預定義好的模型,自帶train,test,predict全套裝備。只要配合tf.estimator.inputs.numpy_input_fn,把數據導進去,裝備好其它需要的參數,開包即用。
這個模型的對於[5.8, 3.1, 5.0, 1.7]這個樣本,官網結果爲2,但我跑出來大部分時間是1,有時爲2。比較無語。
  
發佈了30 篇原創文章 · 獲贊 10 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章