Tensorflow程序构建流程及用鸢尾花数据分类案例

第一部分:Tensorflow编程堆栈

TensorFlow程序堆栈如下图所示,TensorFlow 提供一个包含多个 API 层的编程堆栈:

第二部分: TensorFlow 程序编程的步骤流程

1、导入和解析数据集。

2、创建特征列以描述数据。

3、选择模型类型。

4、训练模型。

5、评估模型的效果。

6、让经过训练的模型进行预测。

第三部分:详细解析TensorFlow程序编程步骤流程

步骤一:创建输入函数

输入函数是返回 tf.data.Dataset 对象的函数,此对象会输出下列含有两个元素的元组:

1、features - Python 字典,其中:

  • A、每个键都是特征的名称。
  • B、每个值都是包含此特征所有值的数组。

2、label - 包含每个样本的标签值的数组。

输入函数可以以您需要的任何方式生成 features 字典和 label 列表。使用 TensorFlow 的 Dataset API,它可以解析各种数据。Dataset API 可以为您处理很多常见情况。使用 Dataset API,您可以轻松地从大量并行文件中读取记录,并将它们合并为单个数据流。

概括来讲,Dataset API 包含下列类:

各个类如下所示:

1、Dataset - 包含创建和转换数据集的方法的基类。您还可以通过该类从内存中的数据或 Python 生成器初始化数据集。

2、TextLineDataset - 从文本文件中读取行。

3、TFRecordDataset - 从 TFRecord 文件中读取记录。

4、FixedLengthRecordDataset - 从二进制文件中读取具有固定大小的记录。

5、Iterator - 提供一次访问一个数据集元素的方法。

步骤二:定义特征列

特征列是一个对象,用于说明模型应该如何使用特征字典中的原始输入数据。在构建 Estimator 模型时,您会向其传递一个特征列的列表,其中包含您希望模型使用的每个特征。tf.feature_column 模块提供很多用于向模型表示数据的选项。

步骤三:实例化 Estimator(Estimator 编程)

Estimator 是 TensorFlow 对完整模型的高级表示。它会处理初始化、日志记录、保存和恢复等细节部分,并具有很多其他功能,以便您可以专注于模型。要根据预创建的 Estimator 编写 TensorFlow 程序,您必须执行下列任务:

1、创建一个或多个输入函数。

2、定义模型的特征列。

3、实例化 Estimator,指定特征列和各种超参数。

4、在 Estimator 对象上调用一个或多个方法,传递适当的输入函数作为数据的来源

在用Estimator的指定模型类型,要实例化一个 Estimator 类。TensorFlow 提供了两类 Estimator:

为了实现神经网络,TensorFlow 提供了几个预创建的分类器 Estimator,其中包括:

tf.estimator.DNNClassifier:适用于执行多类别分类的深度模型。

tf.estimator.DNNLinearCombinedClassifier:适用于宽度和深度模型。

tf.estimator.LinearClassifier:适用于基于线性模型的分类器。

比如用tf.estimator.DNNClassifier 的预创建 Estimator。此 Estimator 会构建一个对样本进行分类的神经网络。以下调用会实例化 DNNClassifier:

    classifier = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
hidden_units=[10, 10],
n_classes=3)

步骤四:训练、评估和预测

我们已经有一个 Estimator 对象,现在可以调用方法来执行下列操作:

1、训练模型。

2、评估经过训练的模型。

3、使用经过训练的模型进行预测。

第四部分:TensorFlow检查点

TensorFlow 提供了两种模型格式:

1、检查点:这种格式依赖于创建模型的代码。

2、SavedModel:这种格式与创建模型的代码无关。

参考资料:https://tensorflow.google.cn/get_started/checkpoints

第五部分:基于TensorFlow使用鸢尾花数据分类

步骤一:程序参考源码:

# -*-coding:utf-8-*-
from __future__ import absolute_import, division, print_function

# 参考网址:https://tensorflow.google.cn/get_started/eager
import os
import matplotlib.pyplot as plt
import tensorflow as tf
import tensorflow.contrib.eager as tfe

tf.enable_eager_execution()
print("TensorFlow version: {}".format(tf.VERSION))
print("Eager execution: {}".format(tf.executing_eagerly()))
train_dataset_url = "http://download.tensorflow.org/data/iris_training.csv"
train_dataset_fp = tf.keras.utils.get_file(fname=os.path.basename(train_dataset_url),
origin=train_dataset_url)
print("Local copy of the dataset file: {}".format(train_dataset_fp))
def parse_csv(line):
example_defaults = [[0.], [0.], [0.], [0.], [0]]  # sets field types
  parsed_line = tf.decode_csv(line, example_defaults)
# First 4 fields are features, combine into single tensor
  features = tf.reshape(parsed_line[:-1], shape=(4,))
# Last field is the label
  label = tf.reshape(parsed_line[-1], shape=())
return features, label

train_dataset = tf.data.TextLineDataset(train_dataset_fp)
train_dataset = train_dataset.skip(1)             # skip the first header row
train_dataset = train_dataset.map(parse_csv)      # parse each row
train_dataset = train_dataset.shuffle(buffer_size=1000)  # randomize
train_dataset = train_dataset.batch(32)

# View a single example entry from a batch
features, label = iter(train_dataset).next()
print("example features:", features[0])
print("example label:", label[0])
model = tf.keras.Sequential([
tf.keras.layers.Dense(10, activation="relu", input_shape=(4,)),  # input shape required
  tf.keras.layers.Dense(10, activation="relu"),

tf.keras.layers.Dense(3)
])
def loss(model, x, y):
y_ = model(x)
return tf.losses.sparse_softmax_cross_entropy(labels=y, logits=y_)
def grad(model, inputs, targets):
with tf.GradientTape() as tape:
loss_value = loss(model, inputs, targets)
return tape.gradient(loss_value, model.variables)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)

## Note: Rerunning this cell uses the same model variables
# keep results for plotting
train_loss_results = []
train_accuracy_results = []
num_epochs = 201
for epoch in range(num_epochs):
epoch_loss_avg = tfe.metrics.Mean()
epoch_accuracy = tfe.metrics.Accuracy()

# Training loop - using batches of 32
  for x, y in train_dataset:
# Optimize the model
    grads = grad(model, x, y)
optimizer.apply_gradients(zip(grads, model.variables),
global_step=tf.train.get_or_create_global_step())
# Track progress
    epoch_loss_avg(loss(model, x, y))  # add current batch loss
    # compare predicted label to actual label
    epoch_accuracy(tf.argmax(model(x), axis=1, output_type=tf.int32), y)
# end epoch
  train_loss_results.append(epoch_loss_avg.result())
train_accuracy_results.append(epoch_accuracy.result())

if epoch % 50 == 0:
print("Epoch {:03d}: Loss: {:.3f}, Accuracy: {:.3%}".format(epoch,
epoch_loss_avg.result(),
epoch_accuracy.result()))
fig, axes = plt.subplots(2, sharex=True, figsize=(12, 8))
fig.suptitle('Training Metrics')
axes[0].set_ylabel("Loss", fontsize=14)
axes[0].plot(train_loss_results)
axes[1].set_ylabel("Accuracy", fontsize=14)
axes[1].set_xlabel("Epoch", fontsize=14)
axes[1].plot(train_accuracy_results)
plt.ion()
plt.show()
test_url = "http://download.tensorflow.org/data/iris_test.csv"
test_fp = tf.keras.utils.get_file(fname=os.path.basename(test_url),
origin=test_url)
test_dataset = tf.data.TextLineDataset(test_fp)
test_dataset = test_dataset.skip(1)             # skip header row
test_dataset = test_dataset.map(parse_csv)      # parse each row with the funcition created earlier
test_dataset = test_dataset.shuffle(1000)       # randomize
test_dataset = test_dataset.batch(32)           # use the same batch size as the training set
test_accuracy = tfe.metrics.Accuracy()
for (x, y) in test_dataset:
prediction = tf.argmax(model(x), axis=1, output_type=tf.int32)
test_accuracy(prediction, y)
print("Test set accuracy: {:.3%}".format(test_accuracy.result()))
class_ids = ["Iris setosa", "Iris versicolor", "Iris virginica"]
predict_dataset = tf.convert_to_tensor([
[5.1, 3.3, 1.7, 0.5,],
[5.9, 3.0, 4.2, 1.5,],
[6.9, 3.1, 5.4, 2.1]
])
predictions = model(predict_dataset)
for i, logits in enumerate(predictions):
class_idx = tf.argmax(logits).numpy()
name = class_ids[class_idx]
print("Example {} prediction: {}".format(i, name))

源码本地位置:F:\TensorFlow\tensorFlow-study\eagerExecution2.py

步骤二:运行结果

D:\Anaconda3\pythonw.exe F:/TensorFlow/tensorFlow-study/eagerExecution2.py

TensorFlow version: 1.8.0

Eager execution: True

Local copy of the dataset file: C:\Users\Administrator\.keras\datasets\iris_training.csv

2018-07-06 20:33:32.251193: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2

example features: tf.Tensor([ 5.80000019  2.70000005  5.0999999   1.89999998], shape=(4,), dtype=float32)

example label: tf.Tensor(2, shape=(), dtype=int32)

Epoch 000: Loss: 1.078, Accuracy: 37.500%

Epoch 050: Loss: 0.630, Accuracy: 70.000%

Epoch 100: Loss: 0.425, Accuracy: 75.000%

Epoch 150: Loss: 0.316, Accuracy: 91.667%

Epoch 200: Loss: 0.206, Accuracy: 97.500%

Test set accuracy: 96.667%

Example 0 prediction: Iris setosa

Example 1 prediction: Iris versicolor

Example 2 prediction: Iris virginica

Process finished with exit code 0

 

参考网址:

Graph Execution 使用入门:

https://tensorflow.google.cn/get_started/get_started_for_beginners

预创建的 Estimator:

https://tensorflow.google.cn/get_started/premade_estimators

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: