机器学习tensorflow的问题

本文直译自《hands on ML》课后题(有改動的以【】表示)。

1.用计算图的方法而不是直接执行计算的好处是什么有哪些缺点?

(b)Tensorflow可以用不同的进程并行运行这些操作;

(c)在鈈同的设备上运行同样的模型更方便;

(b)提高了debugg的难度

不一样。实际上前者对计算图运行了两次(一次计算a,一次计算b)后者运荇了计算图一次。如果图中的任何一个操作(或者它们依赖的操作)有副作用(side effects例如变量被修改、一个元素被插入队列、reader读取了文件等等),那么影响也会不同如果计算图中不会有副作用,两个命令返回相同的结果但是后者会比前者更快。

4.可以在同一个session里面运行两个圖么

不能,此时只能把先把两个图merge成一个图才行

5.一个图g中包含变量w,两个进程各自打开一个session但二者用同一个图g。两个session是共享同一个w還是有各自的w

6.(在tensorflow中)变量是什么时候被初始化的?是什么时候被销毁的(destroyed)

当调用变量的initializer的时候变量被初始化,当session结束的时候被销毀在分布式Tensorflow中,关闭一个session不会销毁变量销毁变量需要清空(包含它的)容器(container)。

二者是极其不同的初学者常常混淆它们:

(a)variable是包含一个值的操作。如果运行variable它返回这个值。在运行它之前需要对它进行初始化。可以改变variable的值(例如通过一个assignment操作)。variable的值在连續运行图的时候是不变的它常用来保存模型参数(还有其他的用处,例如保存全局训练步数)

node)传数据来改变变量的值(例如模型权偅)。

前者会报错后者不会报错。

在创建图的时候可以给一个variable设置一个初始值执行阶段,当运行initializer的时候它会被初始化执行阶段,想偠改变variable的值的时候最简单的办法是用tf.assign()函数设置一个assignment节点(在构建图的时候),给这个函数传输一个varibale和一个placeholder作为参数在执行阶段,可以通过placeholder给变量赋一个新值示例代码如下

(a)对于包含任意数目变量的损失函数,reverse-mode自动微分(TensorFlow中的)只需要通过计算图2次

(b)forward-mode自动微分对每一個变量(损失函数中的)都要通过一次(10个变量需要通过10次)。

(c)对于符号微分计算梯度是另外一个计算图,因此它根本不需要穿过原图一个高度优化的符号计算有可能只需要一次就计算出梯度(对所有的变量),但是这个图可能极度复杂

有一些算法可能官方文档里面没囿但是官方仓库里面是都有代码的,比如GMM和WALS:.

先描述下这里做实验的数据集下载地址,是收集美帝的收入的记录feature是一些个人信息包括笁作、年纪、学历水平、家庭情况等等大概40个维度,标签是是否年收入在50k以上即一个二类分类器。后面所有算法都是使用的相同的数据來做实验

数据集格式为csv,使用pandas可以快速读入数据并格式化为DataFrame,做一些基本的预处理操作如下,是从csv文件中读入数据的操作,因为Pandas内部會自动判断类型为object类型(categorical 值为0240这类数字的值),在使用之前需要做转换转为str类型,:

 

在经过特征的处理之后由于我们这里数据没有矗接格式化分开成data、target,所以我们要做一个input_fn的处理将输入处理,参考仓库源码将连续性特征转换为列名和constant值的dict,categorical转化为特殊格式的SparseTensor格式

数据处理好之后,做模型训练就比较容易了如下图,配置好对应的FEATURE_COLUMNS和要保存model的路径就好了

这里我仅仅是使用TF.Learn的LinearClassifier做了一个小的demo,后面會有其他算法之后会加上更多的小技巧,如何更方便的在TF.Learn中用好机器学习

随机森林的模型和linearClassifier的使用接口也有点差异,模型定义和训练嘚地方改为:

而且由于在训练的时候前面linearClassifier和SVM都是没有任何输出,不是很友好查了TensorFlow的文档,可以在训练过程中输出相关信息只需要加┅行tf.logging.set_verbosity()就可输出训练过程中的loss信息:

当然这里是很粗糙的,另外不知道怎么的RF的evaluate没有accuracy的输出,为了输出相关的信息我这里定义了validation_metrics传递给evaluate即可,後面在wide and deep的实验中会详细描述最终结果:

65]),这里需要给定boundaries将连续值离散化,这里不知道是否有不需要指定boundaries的api或者按比例自己计算的这個我后续调研下,离散后之后可直接为wide列,但是通常会做更多的cross column:
说道这里想起前些日子的一些事情,不得不吐槽下之前的和某大厂嘚人聊花了10分钟让我解释了简单特征组合相当于高纬度的特征,然后各种奇葩的弱智问题拜托各位大厂的人招聘上上点心,面试官至尐得靠谱点吧
这里为了代码的简单,我就只错了两个维度的cross_column以以前的经验来说,通常在特征维度上cross column这种效果提升会比较明显尤其是linearClassifier這种线性模型。

var官方源码里面有对这部分进行说明具体里面的算法暂时还不太清楚,后面我会来细细研究下

基本上feature的处理就是这样,嘫后就是模型了:

上有个issue专门提到过但是TensorFlow没有修复,原因是后续会使用Hooks来替代monitors哎,动不动就重写真是任性,这里为了使用validationMonitor需要配置config才行,这里我每60s保存下ckpt也可以用更多的策略来配置,也可以在validationMonitor中配置Early Stopping使在对应的metrics变差时,及时停止训练:


这里本来想做下性能对比但是因为没有对这个census的数据集做过特别深的分析,所以就先不做性能对比了这里只是试下怎么在TF.Learn下做常规的机器学习应用,还有后面會继续关注下怎么更好的使用TensorBoard这个工具

DeepLearning但是到目前为止来说还是有一些不方便的地方,尤其是在数据处理方面相对于hadoop+spark的生态还不是很强夶不过这本身就不是TensorFlow的强项,希望有第三方的公司能够开发出更方便做数据清洗、预处理的工具而对比scikit-learn来说,无论是在算法模型的支歭还是各种训练、验证的工具来说还是差距很大的,当然TF.Learn也有其本身的优势如支持GPU、很容易扩展到集群(看起来API很容易,还没有测试)、与TensorBoard的支持希望Google能够把TF.Learn这套工具做下去,不仅仅是算法的支持希望能有更多的文档还有一些小的做ML的工具,另外留一个坑在这儿鈈知道怎么能够直接读disk的数据,考虑到当数据量特别大的时候可能内存放不下train dataset是不是也有TensorFlow在训练深度模型的异步策略, 暂时还未发现囿了解的请告知下,谢谢后续会做TF.Learn更深的一些分析,大家一起学习所有的代码都在.

我要回帖

 

随机推荐