Python 3.6 Tensorflow 1.12.0 Pandas 0.23.4 numpy 1.15.4 scikit-learn 0.20.1 virtualenv16.1.0 Jupyter notebook 5.7.2机器学习分辨三种不同花朵程式
项目描述
应用机器学习(Machine Learning – ML)的基本体系结构包括主要两部份:要训练好的模型和利用该模具的分辨能力。本文集中讨论机器学习模型
作者著重介绍一个典型的机器学习能够分辨三种不同花朵但又却是同类花的例子。当然这是十分简单的,不过足以令读者体会到机器学习并不是一件困难的事情。其实不管机器学习对象是什么,就算是专业应用的程序,都要经过以下的步骤:
- 怎样获取应用海量数据。
- 处理数据及应用适当的格式。
- 根据辨认目标而选择合适模型(Model)。
- 导入数据来训练模型。
- 计算其功能效率来评估辨认准确程度。
- 导出及储存该模型。
作者按:怎样应用这个训练得宜的模型会在另外的慱文介绍的-Spring Boot Java 8 应用已训练好的深度机器学习模型(TensorFlow Model)。
应用数据
一般实用的机器学习数据必然是海量的,又叫大数据运作(Big Data Operation),这样做才可以得到有效的机器分辨能力。本文以初学者了解和熟悉机器学习技术为宗旨,故采用现成的网上经典的机器学习数据。我们将使用着名的鸢尾花数据集(Iris Dataset),根据其一些特征(例如花瓣和萼片的长度和宽度)对不同类型的鸢尾花进行分辨,继而在这3种不同的花种:Setosa,Versicolour或Virginica中能够判定是那款指定的花朵。作者不是花朵专家,不能提供其中文名称。以下图片或可能令读者们认识其花朵颜色及形状。我们将使用监督训练和神经网络分类器来处理学习过程。 有关鸢尾花数据集(Iris Dataset),请考scikit learn网站。
图像 1. 三种不同鸢尾花种类
严格地说,本文的主题是应用机器学习之深度学习,乃为更深层的其附属数学推算。为了提高初学者对深度学习有兴趣,笔者简单地介绍深度学习的数学知识。一直以来,人类在研究对脑子怎样传递信息能力保持高度的关注和钦佩。如果机器能够像脑袋一样处理信息,不少工作可以用机器代替人类的!后来科学家模拟脑神经而谓人工神经网络。第一个人工神经网络是由心理学家弗兰克罗森布拉特(Frank Rosenblatt)于1958年发明的。它被称为Perceptron,旨在模拟人类大脑如何处理视觉数据并学会识别物体。我们又知道,人工神经网络是用数学方程式模拟的,主要利用数学中的有序排列的向量(vector), 二维数组(matrix)及三维数组以上叫张量(tensor),制成了一组受大脑结构和功能启发的算法。由于初期人工神经网络算法比较复杂和需时颇久,应用范围不普及。直到最近谷歌(Google)推出第二代机器学习框架-TensorFlow, 可以用于设计,构建和训练深度学习模型。
图像 2. 典型的 TensorFlow 模型
从Figure 2.图像看来,该模型就是一组有排列次序的多维数。也可以说它实际上是一系列张量!信息就是每个张量边缘之间(edges)传递的。在另外数学词谱上再分多层平面向量(plane vector)组合成的。平面向量是最简单的张量设置。在张量边缘之间的基本计算方法则称为图形算法(graph)。整体模拟谓之数据流图(data flow graphs),故此又可以理解为TensorFlow。人工神经网络的数学挑战是怎样最好地优化数千或数百万或任何数量的权重及图形,以便最后在输出层产生所需的模具。 解决这个问题,构建我们的神经网络模型层正是TensorFlow的用途。
怎样成功地安装TensorFlow
网上流传不少怎样在不同平台上安装TensorFlow的, 请多参考怎样安装以上所述的各种工具,尢其怎样操作 jupfter notebook。笔者参考学习机器学习之天书 – Hands On Machine Learning with Scikit Learn and Tensorflow by Aurélien Géron,提供在萍果电脑 (Mac)上的安装方法:( 如果你已经安装了TensorFlow,可以跳过本段。)
建议创建工作区 – 方便集中数据处理
1.在本用户的目录内修改那 .profile档案如下:
$ 在该档案加上export ML_PATH="$HOME/ml" # 保存及退出编辑环境
$ source ~/.profile
$ mkdir -p $ML_PATH #创建ml 目录
$ pip3 install --upgrade pip #更新最近版本
2. 采用隔离的虚拟 Python 环境,就可以避免和现成已安装的Python 环境有冲突
$ pip3 install --user --upgrade virtualen #安装虚拟 Python 环境
$ cd $ML_PATH #进入ml 目录
$ virtualenv env #设置虚拟 Python 环境
3. 每次进入工作环境时:
$ cd $ML_PATH
$ source env/bin/activate
4. 安装所需的工具及附件:
$ pip3 install --upgrade jupyter matplotlib numpy pandas scipy scikit-learn
$ python3 -c "import jupyter, matplotlib, numpy, pandas, scipy, sklearn"
#如果没有错误,那么就是成功安装
$ pip3 install –upgrade tensorflow
测试jupyter notebook/TensorFlow及其工作环境,打开一个终端窗口输入以下指令。
以后的操作都在jupyter notebook上处理的。初学者可在线上学习使用它。
$ cd $ML_PATH
$ source env/bin/activate
$ jupyter notebook # 先按New->python3, 然后按画面数字步骤运作
图像 3. 测试jupyter notebook(默认在localhost://8888)
测试TensorFlow时,在+上用滑鼠浮标按一下,增加了一行输入行,输入以下程式:
图像 4. 测试 TensorFlow 运作成功如果得出是42
怎样处理数据和训练TensorFlow模型
涉及的步骤大至可分为以下:
- 获取数据
- 准备数据
- 将数据划分成训练集和评估集/测试集
- 按照Tensorflow的要求格式化数据
- 训练模型
- 评估模型
- 导出模型
以上都是在jupyter notebook 上操作的,在“+“用滑鼠浮标按一下,增加了一行输入行,输入以下每一道程式/指令,一共10项。
1. 导入模块, 为特征名称起定义“常量”。在塑造模型时最基本的步骤就是判别该目标物体重要特征是什么,在这里列出是花瓣和萼片的长度和宽度
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn import datasets
FEATURE_SEPAL_LENGTH = 'SepalLength'
FEATURE_SEPAL_WIDTH = 'SepalWidth'
FEATURE_PETAL_LENGTH = 'PetalLength'
FEATURE_PETAL_WIDTH = 'PetalWidth'
LABEL = 'label'
2. 采用现成的sklearn提供的数据
# Get the data set
iris = datasets.load_iris()
3. 设定每组加入对应的标签,重置索引。这些标签用是来确认那种花的:(0,1,2)相对的花朵是
(SETOSA, VERSICOLOUR, VIRGINICA)
iris_data_model = []; # add the target to the data
for i in range(len(iris.data)):
value = np.append(iris.data[i], iris.target[i])
iris_data_model.append(value)
4. 设定花朵特征为表列名称,并将该数据导入那熊猫数据框架,重置索引
columns_names = [FEATURE_SEPAL_LENGTH, FEATURE_SEPAL_WIDTH,
FEATURE_PETAL_LENGTH, FEATURE_PETAL_WIDTH, LABEL]
df = pd.DataFrame(data = iris_data_model, columns = columns_names )
df = df.sample(frac=1).reset_index(drop=True)
5. 采取常用机器学习分配数据的方法;20%留给测试用,80%给训练模型的
test_len = (len(df) * 20)//100;
training_df = df[test_len:]
test_df = df[:test_len]
6. 现在是怎样把熊猫数据导入TensorFlow所需要的格式。要求是接收一个可操作图,图的键性是特征的名称,并且相应的值是存储与来自熊猫数据框架的列相同的数据的数组
iris_feature_columns =
[tf.contrib.layers.real_valued_column(FEATURE_SEPAL_LENGTH,
dimension=1, dtype=tf.float32),
tf.contrib.layers.real_valued_column(FEATURE_SEPAL_WIDTH,
dimension=1, dtype=tf.float32),
tf.contrib.layers.real_valued_column(FEATURE_PETAL_LENGTH,
dimension=1, dtype=tf.float32),
tf.contrib.layers.real_valued_column(FEATURE_PETAL_WIDTH,
dimension=1, dtype=tf.float32) ]
x = {FEATURE_SEPAL_LENGTH : np.array(training_df[FEATURE_SEPAL_LENGTH]),
FEATURE_SEPAL_WIDTH : np.array(training_df[FEATURE_SEPAL_WIDTH]),
FEATURE_PETAL_LENGTH :np.array(training_df[FEATURE_PETAL_LENGTH]),
FEATURE_PETAL_WIDTH : np.array(training_df[FEATURE_PETAL_WIDTH]) }
7. 然后,我们对模型进行实例化并训练。根据鸢尾花数据集的资料,我们将使用一个神经网络分类器,具有5个节点和5个隐藏层,它有3个不同类别的输出。
classifier = tf.estimator.DNNClassifier(feature_columns =
iris_feature_columns,
hidden_units = [5, 5],
n_classes = 3)
# Define the training inputs
train_input_fn = tf.estimator.inputs.numpy_input_fn(
x = x,
y = np.array(training_df[LABEL]).astype(int),
num_epochs = None,
shuffle = True)
# Train model.
classifier.train(input_fn = train_input_fn, steps = 4000)
8. 一旦我们训练了模型,我们就使用我们先前分离的评估/测试集对其进行评估:
x = {FEATURE_SEPAL_LENGTH : np.array(test_df[FEATURE_SEPAL_LENGTH]),
FEATURE_SEPAL_WIDTH : np.array(test_df[FEATURE_SEPAL_WIDTH]),
FEATURE_PETAL_LENGTH : np.array(test_df[FEATURE_PETAL_LENGTH]),
FEATURE_PETAL_WIDTH : np.array(test_df[FEATURE_PETAL_WIDTH]) } # # Define the training inputs
test_input_fn = tf.estimator.inputs.numpy_input_fn(
x = x,
y = np.array(test_df[LABEL]).astype(int),
num_epochs = 1,
shuffle = False)
# Evaluate accuracy.
accuracy_score = classifier.evaluate(input_fn=test_input_fn)["accuracy"] print("Test Accuracy: ", accuracy_score)
以下是打印出的结果,测试准确度是1.0, 当然可以接受
INFO:tensorflow:Saving dict for global step 4000: accuracy = 1.0, average_loss = 0.03394517, global_step = 4000, loss = 1.0183551 Test Accuracy: 1.0
9. 实用方面,最好还是要对该模型进行更多实质的手动测试。以保证模型更为测试完善。以下是从原始数据集中获取一些任意资料,包括其各自的特征,并将它们提供给该模型辨认。由于手动测试资料是其中训练的数据,乃是硬编码的,故此其的成功率颇高,在机器学习专门术语中,这叫过度拟合现象。进一步考核该模型,当然需要更多的测试资料及方法!
x = { FEATURE_SEPAL_LENGTH : np.array([5.0, 6.7, 7.4]), FEATURE_SEPAL_WIDTH : np.array([3.5, 3.1, 2.8]),
FEATURE_PETAL_LENGTH : np.array([1.3, 4.4, 6.1]),
FEATURE_PETAL_WIDTH : np.array([0.3, 1.4, 1.9]) }
expected = np.array([0, 1, 2])
# Define the training inputs
predict_input_fn = tf.estimator.inputs.numpy_input_fn(
x = x, num_epochs = 1, shuffle = False)
predictions = classifier.predict(input_fn = predict_input_fn)
for pred_dict, expec in zip(predictions, expected):
class_id = pred_dict['class_ids'][0]
probability = pred_dict['probabilities'][class_id]
print('\nPrediction is "{}" (certainity {:.1f}%), expected "{}"'.format(class_id, 100 * probability, expec))
打印出以上测试的结果;0, 1, 2相对的花朵是 SETOSA, VERICOLOUR, VIRGINCA
Prediction is "0" (certainity 100.0%), expected "0"
Prediction is "1" (certainity 98.0%), expected "1"
Prediction is "2" (certainity 99.8%), expected "2"
10. 设置怎样储存该模型
def serving_input_receiver_fn():
serialized_tf_example = tf.placeholder(dtype = tf.string, shape = [None],
name = 'input_tensors')
receiver_tensors = {'predictor_inputs' : serialized_tf_example}
feature_spec={FEATURE_SEPAL_LENGTH:tf.FixedLenFeature([25],tf.float32),
FEATURE_SEPAL_WIDTH : tf.FixedLenFeature([25], tf.float32),
FEATURE_PETAL_LENGTH : tf.FixedLenFeature([25], tf.float32),
FEATURE_PETAL_WIDTH : tf.FixedLenFeature([25], tf.float32)}
features = tf.parse_example(serialized_tf_example, feature_spec)
return
tf.estimator.export.ServingInputReceiver(features,receiver_tensors)
model_dir =
classifier.export_savedmodel(export_dir_base = "stored_model",
serving_input_receiver_fn = serving_input_receiver_fn,
as_text = True)
print('Model exported to '+ model_dir.decode())
导出及储存该模型在 ./stored_model/1530093489
INFO:tensorflow:SavedModel written to: b"stored_model\\temp-b'1530093489'\\saved_model.pbtxt" Model exported to stored_model\1530093489
怎样执行以上的代码呢?初学者最佳选择是采用jupyter notebook。可以在输入行(cell)上输入每句代码,然后按键 crtl + enter 。如果想马上执行所有以上代码,就在顶部菜单上选 cell -> run all 。也可以把附件解压,放在 $HOME/ml 的目录里,打开jupyter notebook后, 就能见到的。只要对著该附件轻按两下滑鼠即可全部导入jupyter notebook内。操作细节请参考网上资料。在完成执行全部代码后,新的模型会储存起来的。如果有什么问题,可以和笔者沟通的。
所有以上代码在附件里。
运行环境
Python 3.6 Tensorflow 1.12.0 Pandas 0.23.4 numpy 1.15.4 scikit-learn 0.20.1 virtualenv16.1.0 Jupyter notebook 5.7.2
Windows 10/Mac 10.9+/Linux
项目技术
Pythpn+Tensorflow+Pandas+sci-kit-learn+jupyter notebook
spring+spring mvc+mybatis+bootstrap+jquery
项目截图
运作截图
运行 - 训练好的模型是1544292027
猜你喜欢
- /
- /__MACOSX
- /__MACOSX/train_TF_model
- /__MACOSX/train_TF_model/._.DS_Store
- /__MACOSX/train_TF_model/._README.rtf
- /__MACOSX/train_TF_model/stored_model
- /__MACOSX/train_TF_model
- /train_TF_model
- /train_TF_model/.DS_Store
- /train_TF_model/README.rtf
- /train_TF_model/stored_model
- /train_TF_model/stored_model/.DS_Store
- /__MACOSX