1.TensorFlow简介
TensorFlow是Google Brain团队开发的第二代机器学习开源软件库。它基于有状态的数据流图(Data Flow Graph)来表达计算过程,名称中的Tensor称之为张量,Flow可理解为张量在数据流图的节点之间流动,从而完成前向计算过程。TF可以进行自动微分,极大简化了机器学习模型的构建过程。此外,支持分布式的训练在GPU上,核心引擎基于C++编写,提供了python、java、go等接口,目前已被很多公司用做深度学习模型的开发工具。
2. Dataset和Estimator简介
使用TensorFlow的底层API开发机器学习模型时,需要显式地定义模型中的变量和输入数据、以及对会话进行显式的声明和管理,这需要不小的编码量。而使用更高层的Dataset工具类可以很轻松、高效地处理大量的输入数据以及不同的数据格式,相比基于feed_dict的数据输入方式更加高效和规整。并且使用Estimator工具类可以简化机器学习模型的构建过程,Estimator可以自动管理图的构建、变量初始化、模型保存及恢复过程。对一般机器学习pipeline中的训练、评估、预测三个过程进行统一管理。
2.1 Dataset介绍
Dataset表示一系列元素的集合。其中的每个元素可以是单个或者多个Tensor对象。此外,Dataset包含了一系列作用于这些元素上的操作,包含map、flat_map、filter、repeat、shuffle、skip、take等,这类似于Spark中的RDD。
Dataset的创建
- 基于from_tensor_slices方法从tensor中创建,tensor通常来源于numpy Array或者pandas DataFrame
- 基于TextLineDataset从多个文本文件中创建
- 基于TFRecordDataset从多个TFRecord文件中创建,TFRecord是针对大批量数据以二进制进行存储的一种存储格式
Dataset的遍历
- 基于Iterator进行遍历,make_one_shot_iterator()方法可以生成iterator,调用Iterator的get_next()方法就可以得到下一个Dataset中的元素。Dataset主要用于后续Estimator的输入函数中,示例如下:
1 | #自定义训练和评估输入函数 |
2.2 Estimator介绍
Estimator封装了模型的构建、训练、评估、预估以及保存过程,将数据的输入从模型中分离出来。数据输入需要编写单独的函数。
预定义的Estimator
- tf.estimator中内置了GBDT、DNN、LinearClassifer等多种模型,在使用这些模型前,需要指定数据中的特征列,特征列告诉模型如何对数据进行特征工程,tf.feature_column提供了多种常用的用于创建特征列的方法,包含类别型、数值型、类别型特征onehot、数值型特征分桶等。也可以将keras模型转换成estimator。
自定义Estimator
- 预定义的Estimator不能满足需求时,就可以自定义Estimator。主要是要自定义model函数,函数签名为model_fn(features, labels, mode, param),features和labels是输入函数返回的特征和标签,mode表示是要进行模型的训练、评估还是测试。param是传入的额外参数。针对Google提出的wide&deep模型的model_fn如下:
1 | def wide_deep_model_fn(features, labels, mode, params): |
3 Dataset和Estimator的完整使用流程
- 定义用于训练和评估的输入函数input_fn;
- 根据数据集的特点,定义好feature_column;
- 使用预定义的Estimator或者自定义模型函数;
- 调用Estimator的train、eval和predict方法产生结果。