admin管理员组

文章数量:1665131

tensorflow2.0简介

1、tensorflow 2.0基础知识简介

tensorflow2.0是谷歌在2019年3月份发布更新的一款到端开源机器学习平台,其目的在于优化tensorflow1.x版本,使其更灵活和易用性;2.0版本较1.x有较大的更新,具有简易性、更清晰、扩展性三大特征,大大简化1.x 的API,其官方中文文档链接如:https://github/geektutu/tensorflow2-docs-zh
它做了如下更新
• 使用 Keras 和 eager execution 轻松构建模型
• 在任意平台上实现稳健的生产环境模型部署。
• 为研究提供强大的实验工具。
• 通过清理废弃的 API 和减少重复来简化 API,规范API
其架构图如下

tensorflow2.0版本架构图
注释:

  • tf.keras
    Keras 的核心数据结构是 model,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图
    参考链接 https://keras.io/zh/
  • tf.premade Estimators
    Premade Estimators 是类似于keras 一样,是一种构建、训练和验证模型的方式
    实例参考链接:https://tensorflow.juejin.im/get_started/premade_estimators.html
    创建一个有两个隐藏层和每层10个节点的 DNN
    classifier = tf.estimator.DNNClassifier(
    feature_columns=my_feature_columns,

    两个隐藏层,每层 10 个节点。

    hidden_units=[10, 10],

    模型必须在 3 个类别中作出选择

    n_classes=3)
  • TensorFlow Hub(需要tensorflow1.7及以上版本提供)
    tensorflow hub 的主要目标是为模型提供一种简便的封装方式,同时可以简便地复用已封装的模型,可以说 tf hub 是为迁移学习而生的。hub module 在使用时还能设定为参数可训练或者参数不可训练,这样对于不同的任务就能有更灵活的选择。对于一些训练样本较少的情况,可以冻结底层 module 的参数
embedding = "https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1"
hub_layer = hub.KerasLayer(embedding, input_shape=[], 
                           dtype=tf.string, trainable=True)
hub_layer(train_examples_batch[:3])
# 该层使用预先训练的保存模型将句子映射到其嵌入向量。
# 使用的预训练文本嵌入模型(google/tf2-preview/gnews-swivel-20dim/1)将句子拆分为标记
# 嵌入每个标记然后组合嵌入。生成的维度为:(num_examples, embedding_dimension)。
  • TensorFlow Serving
    允许模型通过 HTTP/REST 或 GRPC/协议缓冲区提供服务的 TensorFlow 库构建。
  • TensorFlow Lite
    TensorFlow 针对移动和嵌入式设备的轻量级解决方案提供了在 Android、iOS 和嵌入式系统上部署模型的能力。
  • tensorflow.js
    支持在 JavaScript 环境中部署模型,例如在 Web 浏览器或服务器端通过 Node.js 部署模型。TensorFlow.js 还支持在 JavaScript 中定义模型,并使用类似于 Kera 的 API 直接在 Web 浏览器中进行训练。

2、tensorflow2.0 工作流示例流程

tensorflow 工作流示例流程如下

1. 用 tf.data 加载数据。

用 tf.data 创建的输入线程读取训练数据。使用 tf.feature_column 描述特征特性,例如分段和特征交叉。还支持从内存数据(例如 NumPy)中方便地输入。
如:

# 输入 Numpy 数据
import numpy as np
train_x = np.random.random((1000, 72))
train_y = np.random.random((1000, 10))
val_x = np.random.random((200, 72))
val_y = np.random.random((200, 10))
model.fit(train_x, train_y, epochs=10, batch_size=100,
validation_data=(val_x, val_y))
# tf.data 输入数据
dataset = tf.data.Dataset.from_tensor_slices((train_x, train_y))
dataset = dataset.batch(32)
dataset = dataset.repeat()
val_dataset = tf.data.Dataset.from_tensor_slices((val_x, val_y))
val_dataset = val_dataset.batch(32)
val_dataset = val_dataset.repeat()
model.fit(dataset, epochs=10, steps_per_epoch=30,
          validation_data=val_dataset, validation_steps=3

2. 使用 tf.keras、Premade Estimators 构建、训练和验证模型。

Keras 与 TensorFlow 的其余部分紧密集成,因此你可以随时访问 TensorFlow 的功能。一组标准的打包模型(例如,线性或逻辑回归、梯度提升树、随机森林)也可以直接使用(使用 tf.estimator API 实现)。
同时,它也提供在已有模型的基础上继续训练模型,可通过 TensorFlow Hub 的模块利用迁移学习来训练 Keras 或 Estimator 模型。
tensorflow2.0推荐使用keras构建网络,常见的网络都包含在keras.layer中

3. 用 eager execution 运行和调试,然后在图形上使用 tf.function。

TensorFlow 2.0 默认用 eager execution 运行,以便于轻松使用和顺利调试。此外,tf.function 注释透明地将 Python 程序转换成 TensorFlow 图。这个过程保留了 TensorFlow1.x 基于图形执行的所有优点:性能优化、远程执行,以及序列化、导出和部署的能力,同时增加了用简单 Python 表达程序的灵活性和易用性。

4. 使用分布式策略进行分布式训练。

对于大部分 ML 训练任务来说,Distribution Strategy API 使得在不同的硬件配置上分布和训练模型变得很容易,而无需改变模型定义。由于 TensorFlow 为一系列硬件加速器(如 CPU、GPU、TPU)提供支持,你可以将训练工作负载分配给单节点/多加速器以及多节点/多加速器配置,包括 TPU Pods。尽管这个 API 支持多种群集配置,但提供了在本地或云环境中的 Kubernete 集群上部署训练的模板。

5. 保存模型( SavedModel)。

TensorFlow 将在 SavedModel 上标准化,来作为 TentsorFlow Serving、TensorFlow Lite、TensorFlow.js、TentsorFlow Hub 等的交换格式。(tensorflow1.x 的SavedModels 或存储的 GraphDefs 将向后兼容,用 TensorFlow 1.x 保存的 SavedModels 将继续在 2.x 中加载和执行。然而,2.0 中的更改意味着原始检查点中的变量名可能会更改,所以使用 2.0 之前的检查点而代码已转化为 2.0 时,可能无法保证有效)

3、tensorflow2.0 兼容性和连续性

为了简化向 TensorFlow 2.0 的过渡,将会有一个转化工具来更新 TensorFlow 1.x Python 代码,以使用 TensorFlow 2.0 兼容的 API,或标记代码无法自动转换的情况。但不是所有的变化都可以完全自动化进行。例如,一些被弃用的 API 没有直接的等效物。这也是我们要引入 tensorflowpat.v1 兼容性模块的原因,该模块支持完整的 TensorFlow 1.x API(包括 tf.contrib)。该模块将会在 TensorFlow 2.x 的时间线内得到维护,并允许用 TensorFlow 1.x 编写的代码保持功能。
此外,SavedModel 和 GraphDef 将向后兼容。用 1.x 版本保存的 SavedModel 格式的模型将继续在 2.x 版本中加载和执行。但是,2.0 版本中的变更将意味着原始检查点中的变量名可能会更改,因此使用 2.0 版本之前的检查点(代码已转换为 2.0 版本)并不能保证正常工作。有关详细信息,请参阅 TensorFlow 2.0 指南。

4、tensorflow 2.0与1.x区别

具体说来:
• 删除 queue runner 以支持 tf.data。
• 删除图形集合。
• 变量处理方式的变化。
• API 符号的移动和重命名。
• tf.contrib 将从核心 TensorFlow 存储库和构建过程中移除

4.1 默认动态图机制

在tensorflow2.0中,动态图默认的是不需要自己主动启动它

import tensorflow as tf
a=tf.constant([1,2,3])
b=tf.constant([2,1,3])
print(a+b)
# tf.Tensor([3,3,6]),shape=(3,0),dtype=int32

有了动态图,大大减少了计算量,再也不需要启动复杂的session和graph;
与此同时,2.0删除了Variable_scopes和tf.get_Variable(),需要用面向对象的方式来处理变量共享

4.2 API 符号的移动和重命名&

具体改动
• summary

tf.histogram_summary(var.op.name, var) 改为  tf.summaries.histogram()
tf.scalar_summary('images', images)改为:tf.summary.scalar('images', images)
tf.image_summary('images', images)改为:tf.summary.image('images', images)
tf.merge_all_summaries(

本文标签: 基础简介