【云驻共创】爱不释手的TensorFlow 小技巧及张量诠释

小强鼓掌 发表于 2021/09/29 13:04:58 2021/09/29
【摘要】 TensorFlow 是一个端到端开源机器学习平台。它拥有一个全面而灵活的生态系统,其中包含各种工具、库和社区资源,可助力研究人员推动先进机器学习技术的发展,并使开发者能够轻松地构建和部署由机器学习提供支持的应用。它可以很好的支持深度学习的各种算法,可以支持多种计算平台,系统稳定性较高。TensorFlow拥有多层级结构,可部署于各类服务器、PC终端和网页并支持GPU高性能数值计算。

一、TensorFlow基础

1.1TensorFlow概述

1.2TensorFlow特点

1.3TensorFlow组成

二、TensorFlow小技巧

2.1用Datasets处理数据

2.2用Feature Columns提取特征

2.3用Keras搭建模型

2.4用SavedModel打包模型

2.5 用Eager模式搭建原型

三、TensorFlow张量

3.1张量的概念

3.2 TensorFlow 支持以下三种类型的张量

3.3张量的阶、形状、数据类型

四、总结


一、TensorFlow基础

1.1 TensorFlow概述

TensorFlow是谷歌开源的第二代用于数字计算的软件库。TensorFlow 是一个端到端平台,无论您是专家还是初学者,它都可以让您轻松地构建和部署机器学习模型。它可以很好的支持深度学习的各种算法,但它的应用不局限于深度学习,可以支持多种计算平台,系统稳定性较高。

TensorFlow拥有多层级结构,可部署于各类服务器、PC终端和网页并支持GPU和TPU高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究。

1.2 TensorFlow特点

灵活可扩展TensorFlow在不同计算机上运行:小到智能手机,大到计算机集群都能扩展,可以立刻生成你的训练模型。

多语言支持C++,Python语言。

GPU虽然TensorFlow在大型计算机集群的并行处理中,运行性能略低于CNTK,但是在个人机器使用场景中,会根据机器配置自动选择CPU或GPU,更加友好与智能。

多平台TensorFlow生成的模型,可以满足更多使用者的需求。适用于Mac,Linux,Windows系统上开发。满足开箱即用的模型使用概念。

运算能力强利用了DAG图创建工作流图,优化了计算过程。

分布式目前原生支持的分布式深度学习框架不多,只有 TensorFlow、CNTK、DeepLearning4J、MXNet 等。在单 GPU 的条件下,绝大多数深度学习框架都依赖于 cuDNN,因此只要硬件计算能力或者内存分配差异不大,最终训练速度不会相差太大。

但是对于大规模深度学习来说,巨大的数据量使得单机很难在有限的时间完成训练。而TensorFlow支持分布式训练。

1.3 TensorFlow组成

TensorFlow是由Tensor+Flow组成,Tensor即为张量,Flow为流动,名字的含义就是张量在流动。

二、TensorFlow小技巧

2.1用Datasets处理数据

tensorflow的数据读入有三种方式:通过feeding的方式;通过管道(pipeline)的方式;直接读取变量或常量中保存的数据。Datasets属于上面提出的第二种方式,可以简化数据输入过程,而且能够提高数据的读入效率。

Datasets的组成如上图所示。其中:

​ Dataset:创建和转换数据集的基本;

​ TextLineDataset:从文本文件中读取行;

​ TFRecordDataset:读取TFRecord文件;

​ FixedLengthRecordDataset:从二进制文件读取固定大小的记录;

​ Iterator:提供一种一次访问一个数据集元素的方法。

对于Datasets的使用,我们可以使用Dataset的子类提供的方法,也可以直接使用基类的方法:tf.data.Dataset.from_tensors()或者tf.data.Dataset.from_tensor_slices()。

2.2用Feature Columns提取特征

Feature Columns实际上是一个数据结构,一个用于描述特征的数据结构。利用Feature Columns可以很方便的对输入训练模型前的特征进行处理。比如鸢尾花的识别,对于输入数据,每列表示不同的特征,如花瓣的长度,花萼的长度等等,我们想要对不同的列分别进行处理(或者对所有的列进行处理),使用Feature Columns就可以轻松的实现。

Feature Columns形成了对输入数据集的结构性描述。可以方便我们对每列数据进行处理,而且使得代码的可读性更强。

2.3用Keras搭建模型

想必大家对Keras已经比较了解了,使用Keras来构建一个神经网络,简直是飞一般地速度,而且完美的兼容tensorflow。

simple_model=Sequential()simple_model.add(Dense(3,input_shape=(x.shape[1],),activation='relu',name='layer1'))simple_model.add(Dense(5,activation='relu',name='layer2'))simple_model.add(Dense(1,activation='sigmoid',name='layer3'))

构建一个模型就是如上面这么简单,而且调用API中定义好的模型更是只需要一句话,极其的方便。

2.4用SavedModel打包模型

相比于tensorflow原版的tf.train.Saver保存模型的方式,SavedModel提供了更好的将模型部署到生成环境的手段,更适用于商业目的。

如上图右下方部分,在使用SavedModel打包模型时,可以产生两种模型:

对应于第一种模型,Tensorflow Model Analysis可以方便我们对模型进行分析,是不是存在参数的问题,抑或是模型哪里设计的不合适等等;通过分析后,感觉模型不错,我们就可以通过Tensorflow Serving进行部署。

此外,相比于Saver的方式,我们在inference时不需要再重新定义Graph(模型),如果使用Saver的话,在使用该模型时就需要再定义该模型,如果是一个程序猿设计并使用的还好,如果换成另一个猿去用这个模型,他又不知道模型的tensor的情况,那就尴尬了。所以使用SavedModel可以让我们更轻松地去使用模型。

2.5 用Eager模式搭建原型

使用Eager有什么好处呢?回想之前我们在调试tensorflow的程序时,不得不使用sess.run(),麻烦的要死,而使用Eager就可以直接的将变量打印出来,大大方便了我们的调试;好处不止这么多,在进行模型搭建的时候,以前我们需要仔细考虑下Tensor的shape,一旦出错要定位也很不容易。而使用Eager可以一边搭建网络结构,一边将shape打印出来确认下是否正确。这就使我们在搭建网络时更加方面快捷了;此外,使用Eager后,自定义Operation和Gradient也会方便很多。

下面举个简单的小例子。首先使用pip install tf-nightly(或GPU版本pip install tf-nightly-gpu)来安装Eager。

import tensorflow as tfimport tensorflow.contrib.eager as tfetfe.enable_eager_execution() #开启Eager模式a = tf.constant([5], dtype=tf.int32)for i in range(a): print (i)

三、TensorFlow的张量(tensor)

3.1张量的概念张量是TensorFlow的核心数据单位,在本质上是一个任意维的数组。张量可理解为一个 n 维矩阵,所有类型的数据,包括标量、矢量和矩阵等都是特殊类型的张量。

3.2 TensorFlow 支持以下三种类型的张量:

1. 常量constant:常量是其值不能改变的张量。

2. 变量variable:当一个量在会话中的值需要更新时,使用变量来表示。例如,在神经网络中,权重需要在训练期间更新,可以通过将权重声明为变量来实现。变量在使用前需要被显示初始化。另外需要注意的是,常量存储在计算图的定义中,每次加载图时都会加载相关变量。换句话说,它们是占用内存的。另一方面,变量又是分开存储的。它们可以存储在参数服务器上。

3. 占位符placeholder:用于将值输入 TensorFlow 图中。它们可以和 feed_dict 一起使用来输入数据。在训练神经网络时,它们通常用于提供新的训练样本。在会话中运行计算图时,可以为占位符赋值。这样在构建一个计算图时不需要真正地输入数据。需要注意的是,占位符不包含任何数据,因此不需要初始化它们。

3.3张量的阶、形状、数据类型

阶:在TensorFlow系统中,张量的维数来被描述为.但是张量的阶和矩阵的阶并不是同一个概念.张量的阶(有时是关于如顺序或度数或者是n维)是张量维数的一个数量描述.比如,下面的张量(使用Python中list定义的)就是2阶。

t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

你可以认为一个二阶张量就是我们平常所说的矩阵,一阶张量可以认为是一个向量.对于一个二阶张量你可以用语句t[i, j]来访问其中的任何元素.而对于三阶张量你可以用t[i, j, k]来访问其中的任何元素。

数学实例

Python 例子

0

纯量 (只有大小)

s = 483

1

向量(大小和方向)

v = [1.1, 2.2, 3.3]

2

矩阵(数据表)

m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

3

3阶张量 (数据立体)

t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]]

n

n阶 (自己想想看)

....

形状:TensorFlow文档中使用了三种记号来方便地描述张量的维度:阶,形状以及维数.下表展示了他们之间的关系:

形状

维数

实例

0

[ ]

0-D

一个 0维张量. 一个纯量.

1

[D0]

1-D

一个1维张量的形式[5].

2

[D0, D1]

2-D

一个2维张量的形式[3, 4].

3

[D0, D1, D2]

3-D

一个3维张量的形式 [1, 4, 3].

n

[D0, D1, ... Dn]

n-D

一个n维张量的形式 [D0, D1, ... Dn].

形状可以通过Python中的整数列表或元祖(int list或tuples)来表示,也或者用TensorShape class。

数据类型:除了维度,Tensors有一个数据类型属性.你可以为一个张量指定下列数据类型中的任意一个类型:

数据类型

Python 类型

描述

DT_FLOAT

tf.float32

32 位浮点数.

DT_DOUBLE

tf.float64

64 位浮点数.

DT_INT64

tf.int64

64 位有符号整型.

DT_INT32

tf.int32

32 位有符号整型.

DT_INT16

tf.int16

16 位有符号整型.

DT_INT8

tf.int8

8 位有符号整型.

DT_UINT8

tf.uint8

8 位无符号整型.

DT_STRING

tf.string

可变长度的字节数组.每一个张量元素都是一个字节数组.

DT_BOOL

tf.bool

布尔型.

DT_COMPLEX64

tf.complex64

由两个32位浮点数组成的复数:实数和虚数.

DT_QINT32

tf.qint32

用于量化Ops的32位有符号整型.

DT_QINT8

tf.qint8

用于量化Ops的8位有符号整型.

DT_QUINT8

tf.quint8

用于量化Ops的8位无符号整型.

四、总结

TensorFlow用张量这种数据结构来表示所有的数据。你可以把一个张量想象成一个n维的数组或列表。一个张量有一个静态类型和动态类型的维数,张量可以在图中的节点之间流通。就形成了TensorFlow 。TensorFlow易于理解,它的API保持着高度的一致性,这意味着在尝试不同模型时,无需从头学习一套新的东西。TensorFlow API很稳定,维护者始终在努力确保每次改动都向下兼容。TensorFlow与NumPy无缝集成,可使大多数了解Python的数据科学家如鱼得水。不同于其他库,TensorFlow不占编译时间。这就使用户可快速验证自己的想法,而省去了专门的等待时间。

本文整理自华为云社区内容共创活动之有哪些 TensorFlow 小技巧?什么是张量 (tensor)?

查看活动详情:https://bbs.huaweicloud.com/blogs/298594


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。