【云驻共创】爱不释手的TensorFlow 小技巧及张量诠释
一、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
- 点赞
- 收藏
- 关注作者
评论(0)