基础概念

在tensorflow程序中应包含两个部分:
一个是构建计算图的部分,
另一个是把建好的计算图放在一个Sesstion会话中的执行部分。
定义与执行分开的好处在于tensorflow的统一优化和避免上下文切换$_{[4]}$。

Graph图
计算图Graph)由操作(operation)构成的节点以及tensor数据流/variable变量数据构成的边组成。

默认的Graph:当你创建Operation、Tensor时,tensorflow会将你这些节点和边自动添加到这个默认Graph中。

定义多个Graph图。

可以指定运行计算图的设备。

张量
tensor
构成计算图的边。

阶数:
张量的阶数有时候也称为维度,或者轴.

例子:
譬如一个矩阵[[1,2],[3,4]],是一个2阶张量,有两个维度或轴,
沿着第0个轴(为了与python的计数方式一致,本文档维度和轴从0算起)你看到的是[1,2],[3,4]两个向量,
沿着第1个轴你看到的是[1,3],[2,4]两个向量。

操作
Operation
构成计算图的结点。

比如矩阵乘法操作

会话
Session
计算图必须被放进一个会话Sesstion里面。

当使用Sesstion的run方法执行计算图的某个operation,这个operation才会被执行。

没有被run的operation,不会被执行。

占位符
placeholder
在会话运行时动态提供输入数据。Placeholder相当于定义了一个位置,在这个位置上的数据在程序运行时再指定。

用于喂入训练样本。

不需要提供初始值,在运行时session.run中指定。
变量
Variable
可训练的变量使用Variable封装,比如权重w。

声明的时候有一个初始值。

函数

slice

def slice(input_, begin, size, name=None):
一个张量,begin 和 size都是一个数组,长度是input_的维度。
begin中每个元素表示,如果是第一个元素表示第一个维度的截取开始下标。
size中的每个元素表示,如果是第一个元素表示第一个维度的截取个数。

2.x

一、按照阶段划分

大的阶段分为trainning 和 deployment两个阶段。

1、数据与特征
使用tf.data加载数据,输入管道读取训练数据。
利用tf.feature_column描述特征。

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

3、使用分布式策略进行分布式训练。

4、导出到Saved Model

二、按照层级划分

  1. 高层API (High level): 包括Estimators、Keras以及预构建好的Premade estimator(如线性回归、逻辑回归这些、推荐排序模型wide&deep);
  2. 中层API (Mid level): 包括layers, datasets, loss和metrics等具有功能性的函数,例如网络层的定义,Loss Function,对结果的测量函数等;
  3. 底层API (Low level): 包括具体的加减乘除、具有解析式的数学函数、卷积、对Tensor属性的测量等。

特征

FeatureColumn

作用:
特征列(Feature column)是原始数据和 Estimator 之间的接口,它告诉Estimator如何使用数据。

函数路径:tf.feature_column.*

每个函数对应一个类来表示该FeatureColumn。

按功能分类

一、CategoricalColumn
以下函数返回的类均是 CategoricalColumn的子类。
1、 categorical_column_with_identity
输入是integers类型时使用

2、 categorical_column_with_vocabulary_list or categorical_column_with_vocabulary_file

num_oov_buckets可以设置比初始化时指定词汇表长度多出的类别个数。

可以支持string and integer types。

类别比较多的时候用file。

3、 categorical_column_with_hash_bucket
hash分桶,可以指定桶的个数,使用取余法分桶。

多个输入值可能会映射到同一个桶。

4、 crossed_column
返回一个类别特征交叉的列。

先笛卡尔积运算,然后再hash(%hash_bucket_size)。

用于交叉的类别特征可以用字符串表示也可以用CategoricalCoumn表示。

二、 DenseColumn
1、 numeric_column
可以指定形状。
可以指定标准化函数。
可以指定默认值。

2、indicator_column
输入是categorical_column。

是categorical_column的multi-hot表示。

对于DNN模型,indicator_column可以用来包装任何categorical_column_*。

当桶或唯一值的数量非常大的时候,考虑embedding_column。

对于Wide模型(又称Linear),当直接向linear_model传入类别特征时,indicator_column是类别特征的内部表示。

少量的值使用该特征。
3、embedding_column
从稀疏类别输入转换得到的DenseColumn。

什么时候使用:当你的输入是稀疏的时候但是需要把他们转换成一个稠密表示的时候。

输入是CategoricalColumn。

很多特征值时使用该特征降低模型的大小。
三、 BucketizedColumn

通过边界值表示离散化稠密输入。
对应的输入列必须是数字列,并且是一维的。

返回的类BucketizedColumn继承自DenseColumn和CategoricalColumn。

使用建议

1、 Deep neural network models:
比如DNNClassifier 和 DNNRegressor。

连续特征可以直接喂入深度神经网络模型。

喂入稀疏特征时,需要用embedding_column或者 indicator_column封装。

2、Wide模型
又称为线性模型,比如LinearClassifier 和 LinearRegresso。

稀疏特征可以直接喂入线性模型。他们表现像一个indicator column但是有一个更高效的实现。

连续值喂入线性模型之前建议先被分桶。

为了形成非线性,稀疏特征可以被交叉之后再喂入线性模型。

参考
【Keras】张量的阶数
TensorFlow入门13 -- 特征列(Feature column)
张量如何切分
【4】tf.placeholder函数说明

肖圣贤
31 声望5 粉丝

学习让我充实