Tensorflow快餐教程(11) - 不懂机器学习就只调API行不行?

简介: Tensorflow高层API

高层封装API

有同学问,我们学习Tensorflow就是想学习一套可以用的套,像编程一样调用就行了,不想学习机器学习的细节,有没有这样的方式?

针对于已经有成熟解决方案的模型,why not呢?
在前面已经快速将CNN, RNN的大致概念和深度学习的简史走马观花过了一遍之后,我们就可以开始尝试使用高层封装的API。

模型 - 训练 - 评估 三条语句搞定

既然高层封装,我们就采用最简单的方式:首先是一个模型,然后就开始训练,最后评估一下效果如何。

我们还是举祖传的MNIST的例子。
核心三条语句,一句模型,一句训练,一句评估:

estimator = tf.estimator.LinearClassifier(feature_columns=[image_column], n_classes=10)

# Train.
estimator.train(input_fn=train_input_fn, steps=2000)

# Evaluate and report metrics.
eval_metrics = estimator.evaluate(input_fn=eval_input_fn, steps=1)

我们首先知道MNIST是把手写图像分成十类,那么就用个线性回归分类器,指定分成10类:

estimator = tf.estimator.LinearClassifier(feature_columns=[image_column], n_classes=10)

训练也是无脑的,指定训练多少步就是了:

estimator.train(input_fn=train_input_fn, steps=2000)

评估也不需要懂啥,给个测试集就是了:

eval_metrics = estimator.evaluate(input_fn=eval_input_fn, steps=1)

给大家一个完整能运行的例子,主要的工作量都在处理输入数据上,真正有功能的就是那三条语句:

import numpy as np
import tensorflow as tf

def get_input_fn(dataset_split, batch_size, capacity=10000, min_after_dequeue=3000):

  def _input_fn():
    images_batch, labels_batch = tf.train.shuffle_batch(
        tensors=[dataset_split.images, dataset_split.labels.astype(np.int32)],
        batch_size=batch_size,
        capacity=capacity,
        min_after_dequeue=min_after_dequeue,
        enqueue_many=True,
        num_threads=4)
    features_map = {'images': images_batch}
    return features_map, labels_batch

  return _input_fn

data = tf.contrib.learn.datasets.mnist.load_mnist()

train_input_fn = get_input_fn(data.train, batch_size=256)
eval_input_fn = get_input_fn(data.validation, batch_size=5000)

# Specify the feature(s) to be used by the estimator.
image_column = tf.contrib.layers.real_valued_column('images', dimension=784)
estimator = tf.estimator.LinearClassifier(feature_columns=[image_column], n_classes=10)

# Train.
estimator.train(input_fn=train_input_fn, steps=2000)

# Evaluate and report metrics.
eval_metrics = estimator.evaluate(input_fn=eval_input_fn, steps=1)
print(eval_metrics)

三步法进阶

现在我们已经学会三步法了。虽然不涉及底层细节,我们还是有很多工具可以做得更好的。

比如我们要自己设计优化方法, 从三条语句变成四条:

optimizer2 = tf.train.FtrlOptimizer(learning_rate=5.0, l2_regularization_strength=1.0)
estimator2 = tf.estimator.LinearClassifier(
    feature_columns=[image_column], n_classes=10, optimizer=optimizer2)

# Train.
estimator2.train(input_fn=train_input_fn, steps=2000)

# Evaluate and report metrics.
eval_metrics2 = estimator2.evaluate(input_fn=eval_input_fn, steps=1)
print(eval_metrics2)

这段代码不是片断,拼接到上面的代码的后面就可以直接运行。

更进一步:支持向量机

默认的虽然通用,但是效果可能不如更专业的更好。比如我们想用前深度学习时代最强大的工具之一 - 支持向量机来进行MNIST识别。我们还是可以用高层API来实现。将LinearClassifier换成KernelLinearClassifier。

optimizer3 = tf.train.FtrlOptimizer(
   learning_rate=50.0, l2_regularization_strength=0.001)

kernel_mapper3 = tf.contrib.kernel_methods.RandomFourierFeatureMapper(
  input_dim=784, output_dim=2000, stddev=5.0, name='rffm')
kernel_mappers3 = {image_column: [kernel_mapper3]}
estimator3 = tf.contrib.kernel_methods.KernelLinearClassifier(
   n_classes=10, optimizer=optimizer3, kernel_mappers=kernel_mappers3)

# Train.
estimator3.fit(input_fn=train_input_fn, steps=2000)

# Evaluate and report metrics.
eval_metrics3 = estimator3.evaluate(input_fn=eval_input_fn, steps=1)
print(eval_metrics3)

我们来比较一下三种方法:

Elapsed time: 80.69186925888062 seconds
{'loss': 0.26811677, 'accuracy': 0.9228, 'global_step': 2000}
Elapsed time: 80.33205699920654 seconds
{'loss': 0.26356304, 'accuracy': 0.9276, 'global_step': 2000}
Elapsed time: 98.87778902053833 seconds
{'loss': 0.10834637, 'accuracy': 0.9668, 'global_step': 2000}

SVM支持向量机力量果然强大,从92%的识别率提升到了96%.

高层深度学习API

准备数据的语句不变,我们再加一种采用深度学习的方式,也是三步:

classifier = tf.estimator.DNNClassifier(
    feature_columns=[image_column],
    hidden_units=[784, 625],
    n_classes=10)

# Train.
classifier.train(
    input_fn=train_input_fn,
    steps=2000)

eval_result = classifier.evaluate(
    input_fn=eval_input_fn, steps=1)

print(eval_result)

打印出来的结果如下:

{'accuracy': 0.9812, 'average_loss': 0.064692736, 'loss': 323.46368, 'global_step': 2000}

识别率达到98%,比支持向量机还要强一些。

Tensorflow的API结构

Tensorflow API

我们从第一讲到第十讲学习的都是Mid-Level API。这一讲讲的是High-Level API。

Tensorflow r1.8 Estimators API的变化

Tensorflow API的变化一向以迅速著称,兼容性也不是很好。
tf.estimator.Estimators的前身是tf.contrib.learn.Estimators。

我们对比一下LinearClassifier在这两个版本的区别:
新版:

estimator = tf.estimator.LinearClassifier(feature_columns=[image_column],
                                          n_classes=10)

# Train.
estimator.train(input_fn=train_input_fn, steps=2000)

# Evaluate and report metrics.
eval_metrics = estimator.evaluate(input_fn=eval_input_fn, steps=1)

旧版:

estimator = tf.contrib.learn.LinearClassifier(feature_columns=[image_column], n_classes=10)

# Train.
estimator.fit(input_fn=train_input_fn, steps=2000)

# Evaluate and report metrics.
eval_metrics = estimator.evaluate(input_fn=eval_input_fn, steps=1)
print(eval_metrics)

主要区别为:

  1. 包名改变了
  2. 新版的训练方法是train,而旧版是fit。
    因为新版本没有提供支持向量机的分类器,我们用的核函数版本的KernelLinearClassifier还是老的包中的,所以还是用的fit来训练。

前情提要

有对前10节感兴趣的,请移步:
Tensorflow快餐教程(1) - 30行代码搞定手写识别:https://yq.aliyun.com/articles/582122
Tensorflow快餐教程(2) - 标量运算:https://yq.aliyun.com/articles/582490
Tensorflow快餐教程(3) - 向量:https://yq.aliyun.com/articles/584202
Tensorflow快餐教程(4) - 矩阵:https://yq.aliyun.com/articles/584526
Tensorflow快餐教程(5) - 范数:https://yq.aliyun.com/articles/584896
Tensorflow快餐教程(6) - 矩阵分解:https://yq.aliyun.com/articles/585599
Tensorflow快餐教程(7) - 梯度下降:https://yq.aliyun.com/articles/587350
Tensorflow快餐教程(8) - 深度学习简史:https://yq.aliyun.com/articles/588920
Tensorflow快餐教程(9) - 卷积:https://yq.aliyun.com/articles/590233
Tensorflow快餐教程(10) - 循环神经网络: https://yq.aliyun.com/articles/591118

目录
相关文章
|
17天前
|
API
获取网页重定向地址免费API接口教程
该API用于获取网页重定向跳转后的最终地址。请求地址为`https://cn.apihz.cn/api/wangzhan/tiaozhuan.php`,支持POST或GET方式。请求参数包括`id`、`key`和`url`,返回数据包含状态码`code`和最终URL`url`。示例返回:`{"code":200,"url":"https://www.baidu.com/"}`。
63 29
|
5天前
|
API 网络安全
发送UDP数据免费API接口教程
此API用于向指定主机发送UDP数据,支持POST或GET请求。需提供用户ID、密钥、接收IP及端口、数据内容等参数。返回状态码和信息提示。示例中含公共ID与KEY,建议使用个人凭证以提高调用频率。
29 13
|
3天前
|
API
icp备案查询免费API接口教程
该接口用于查询指定域名的ICP备案信息,支持POST或GET请求方式。请求时需提供用户ID、用户KEY及待查询的域名,可选参数为查询通道。响应中包含状态码、消息内容、备案号、备案主体、域名及审核时间等信息。示例中提供了GET和POST请求方式及返回数据样例。
|
14天前
|
API
天气预报1天-中国气象局-地址查询版免费API接口教程
此接口提供中国气象局官方的当日天气信息,支持POST和GET请求,需提供用户ID、KEY、省份及具体地点。返回数据包括状态码、消息、天气详情等。示例中使用的ID与KEY为公共测试用,建议使用个人ID与KEY以享受更高调用频次。
|
8天前
|
JSON API 数据格式
随机头像图片[API盒子官方资源库]免费API接口教程
API盒子提供的头像资源接口,包含大量网络公开收集的头像,适合非商业用途。支持POST/GET请求,需提供用户ID、KEY及返回格式类型。返回数据包括状态码和消息内容,支持JSON/TXT格式。更多详情见API盒子官网。
|
18天前
|
网络协议 API
检测指定TCP端口开放状态免费API接口教程
该API用于检测目标主机指定TCP端口是否开放,适用于检测连通状态等场景。支持指定大陆、美国、香港等检测节点。请求地址为 `https://cn.apihz.cn/api/wangzhan/port.php`,支持POST和GET请求方式。请求参数包括 `id`、`key`、`type`、`host` 和 `port`。返回参数包含检测结果和状态码。示例请求:`https://cn.apihz.cn/api/wangzhan/port.php?id=88888888&key=88888888&type=1&host=49.234.56.78&port=80`。
|
17天前
|
API 数据安全/隐私保护
抖音视频,图集无水印直链解析免费API接口教程
该接口用于解析抖音视频和图集的无水印直链地址。请求地址为 `https://cn.apihz.cn/api/fun/douyin.php`,支持POST或GET请求。请求参数包括用户ID、用户KEY和视频或图集地址。返回参数包括状态码、信息提示、作者昵称、标题、视频地址、封面、图集和类型。示例请求和返回数据详见文档。
|
17天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
55 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
17天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
64 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
17天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
62 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型