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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章