英文 中文 登录

TensorFlow

    今日:712| 主题:323
收藏本版
发表新帖

谷歌:为何从Scikit-learn转向TensorFlow

[复制链接]
Tenxm 发表于 2017-6-13 09:49:14
198 1

图:pixabay
本文编译自medium,作者为谷歌机器学习专家KarthikMSwamy。该专家日前撰文,讨论了TensorFlow与开源学习工具Scikit-Learn的异同及其先进性,并探讨TensorFlow的未来发展前景。
在过去这一年半的时间里,TensorFlow在采用率和计算速度等方面,均以惊人的速度在增长。

图:deliprao.com
TensorFlow已经成为最受欢迎的机器学习算法开发库。但与此同时,它似乎也把自己定位为一个需要对会话和图表进行定义的库,而这是相当乏味和耗时的。尽管它在有效地计算梯度来训练卷积神经网络(CNN)、循环神经网络(RNN)和长短期记忆网络(LSTM)方面做得非常好,但也不尽然。

深度学习框架排序
在这一系列的帖子中,我想讨论一下TensorFlow是如何用作通用机器学习库的。更具体地说,我们将讨论TensorFlow是如何类似于机器学习工具scikit-learn的,这是同样在数据科学家和开发人员中非常受欢迎的另一个机器学习库。
转向TensorFlow的原因
虽然scikit-learn在其算法库中具有高度优化的算法,但是当面对大量数据点时,它缺乏扩大的能力。而TensorFlow却可以提供相当多的优于scikit-learn的特点:
•高性能机器学习模块
•定制灵活性
•缩放以适应大数据点
•能够利用GPU并对地理分布式GPU设备进行训练
•设备不可知计算
•利用谷歌云对经过训练的机器学习模型进行推理
•高度灵活的Apache 2.0许可证,而scikit-learn是基于BSD许可证(虽然两者都是商业上可用的,但Apache 2.0不太容易受到专利诉讼)
目标
了解scikit-learn和TensorFlow之间类似的功能,这将使scikit-learn用户无缝地来使用TensorFlow。

使用scikit-learn和TensorFlow开发一个从“鸢尾花数据集”中进行花品种分类的程序,以理解构建这样的系统所需的努力。
展示TensorFlow是如何容易地为原型设计新的思路。
功能级别的相似性
scikit-learn受欢迎的原因之一是它很简单
classifier.fit() / classifier.predict()
使用任何一种分类器都可以使用相同的方法。这种简单的用户体验允许开发人员专注于算法及其参数,而不用担心那些需要被调用来完成手头任务的API。
另一方面,我们在TensorFlow中有高级API,这是受到scikit-learn的启发而得到的。TensorFlow中的这些功能与scikit-learn非常相似,具有类似的拟合和预测方法,以及允许进一步微调的其他功能。
在深入研究使用TensorFlow的高级API调用来开发我们的分类框架之前,我们先来讨论TensorFlow的低级计算框架。TensorFlow使用计算图表来执行其所有的计算。计算被表示为tf.Graph对象的一个实例,而其中的数据被表示为tf.Tensor对象,并使用tf.Operation对象对这样的张量对象进行操作。然后再使用tf.Session对象的会话中执行该图表。显而易见的是,使用TensorFlow的低级API创建分类框架将需要测试一个简单的机器学习原型。这就是我们讨论TensorFlow的高级API以与scikit-learn的API进行比较的原因之一。我们将会在接下来的帖子中讨论低级API及其用法。
示例代码
我们使用scikit-learn的支持向量机(SVM)模块和TensorFlow的高级API构建分类器,以根据花的特征来对花进行分类。在这种情况下,数据集提供了四种不同的特征,比如萼片宽度、萼片长度、花瓣宽度和花瓣长度,以变将花分为这三种花种中的一种——Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾)。
在我的GitHub页面上可以找到该项目的代码。

图:TensorFlow.org
如果我们看一下GitHub链接,我们可以看到数据加载和拆分功能是由两个框架共享的。我们在scikit-learn中定义一个SVM分类器,如下所示:
# ------------------------------------------
# Scikit Learn Implementation
# ------------------------------------------
# Use support vector classification
classifier_sk = svm.SVC()
# Use the train data to train this classifier
classifier_sk.fit(x_train, y_train)
# Use the trained model to predict on the test data
predictions = classifier_sk.predict(x_test)
score = metrics.accuracy_score(y_test, predictions)
在上面的代码片段中,我们简单地定义了一个支持向量分类器svm.SVC(),其对象用于训练和预测。我们使用fit()实现训练,而使用predict()方法调用实现预测。最后,我们计算出这四行代码片段的最后一行的精度值。
另一方面,在TensorFlow中,我们可以使用一个深层神经网络(DNN)分类器来执行相同的任务。我们使用的TensorFlow的contrib模块下可用的DNNClassifier,如下所示:
# ------------------------------------------
# TensorFlow Implementation
# ------------------------------------------
# Extract the features from the training data
feats = tf.contrib.learn.infer_real_valued_columns_from_input(x_train)
# Building a 3-layer DNN with 50 units each.
classifier_tf = tf.contrib.learn.DNNClassifier(feature_columns=feats,
hidden_units=[50, 50, 50],
n_classes=3)
# Use the train data to train this classifier
classifier_tf.fit(x_train, y_train, steps=5000)
# Use the trained model to predict on the test data
predictions = list(classifier_tf.predict(x_test, as_iterable=True))
score = metrics.accuracy_score(y_test, predictions)
在上面的代码片段中,我们可以看到如何为数量几乎相同的行构建一个DNN(除了用于将输入数据转换为特征的附加行除外)。这个附加行完成将输入数据转换为密集、定长的浮点值。
TensorFlow迁移路径
虽然从一个框架转移到另一个框架的任务通常是令人张皇无措的,甚至有时令人沮丧,但是TensorFlow好像有些不一样,它似乎有一个桥梁,允许开发人员从不同的框架中平稳过渡。contrib.learn模块就提供了一个这样的桥梁,可以从scikit-learn或Keras进入到TensorFlow。
TensorFlow还适应于包含针对生产质量使用进行高度优化的读写器,与此同时,还支持机器学习社区使用的大多数文件格式。这使得开发人员可以避免使用其他框架,如Pandas(这是很重要的阅读文件,但仍然需要手动将数据提供到机器学习框架中。)在今年早些时候举行的TensorFlow发展峰会上,TensorFlow读写器已被证实具有十分高的性能。
总结
在这篇文章中,我们着手研究开发一个使用scikit-learn和TensorFlow来完成一个简单任务的分类器。我们讨论了高级TensorFlowAPI与scikit-learn的API是如何相似的。你可以在我的GitHub页面访问本博客中讨论的代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

Wicked 发表于 2017-6-13 09:49:14
写一下skflow就更好了
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热帖滚动

推荐阅读

阅读排行

扫描二维码 关注我们官方微信 RDMA知识一手掌握

联系我们

点击发送邮件

   HPC Advisory Council 版权所有   京ICP备17021631号-1

QQ- Archiver-手机版- RDMAWorld.com