CS20SI:深度学习研究中的Tensorflow(cs20si.stanford.edu)
由Chip Huyen编写([email protected])
评论者:Danijar Hafner,Jon Gautier,Minh-Thang Luong,Paul Warren
写机器智能那本书的大神讲了一个 Tensorflow 存在的极好的理由,即如下我所引用的内容:
尽管深度学习背后的数学概念已经存在了几十年,但是构建和训练这些模型却是近几年的事情。不幸的是,大部分的库虽然有很大的灵活性也很有使用价值,要知道,一个灵活的库对于构建一个模型来说,其价值是不可估量的。但是,适合训练模型的这些库速度通常都很慢,不适合在实际中使用。另一方面,快速高效的库在分布式硬件中使用比较合适,而且他们通常在训练特定的神经网络中使用而不适用于研究新的更好的模型。这使得决策者进退两难:我们是应该尝试去使用那些不太灵活的库,那样就不用重构代码?还是应该使用一个完全不同的库?如果我们选择前者,可能就不能测试一些完全不同类型的神经网络模型,如果选择后者,我们代码就会有完全不同的API。如果我们甚至有了这方面的资源呢?Tensorflow旨在解决这个困境。
所以什么是 Tensorflow 呢?
Tensorflow最初是由谷歌作为一个内部机器学习工具创立的,从2015年11月后在 Apache2.0 协议下开源使用。为了更好的理解它是什么,让我们看看它的创造者怎么说。
在Tensorflow官网上,我们能看到:
标语:一个针对机器智能的开源软件库
定义:TensorFlow™ 是一个采用数据流图,用于数值计算的开源软件库。
显而易见,Tensorflow 是开源的。然而,注意,只有我们看到的在Github上实施的Tensorflow是开源的,谷歌是自己维护了其内部版本的。
据说,谷歌这么做是因为 Tensorflow 与它的其他内部工具之间有着非常复杂的关系,而不是因为谷歌自己“囤积好东西”。这是最好的也是我们希望的。
接下来我们看到的关键词是Tensorflow是一个“机器智能软件库”。这是十几家大型企业开发的机器智能库之一。而且可能是最新的。当前所有深度学习库的列表,请访问此链接
为什么要Tensorflow?
鉴于这些库过多,我们为什么要选择Tensorflow来教这门课程?第一个标准是,此库比较受欢迎。在那些列表中,四个最受欢迎的库,基于我们对同行的观察,在斯坦福大学,分别是Theano,Torch,还有Tensorflow。
Torch框架是用Lua编写的,这是一个非常好的语言但不幸的是我们对它并不很熟悉。对外在游戏发展社区和深度学习社区它也不是很受欢迎的。
对于Theano,“深度学习基础”这本书做了一个它与Tensorflow的比较:
首先,Theano有一个额外的“编译图”这一步需要花费点时间去设置特定的深度学习架构。虽然与训练时间相比较短,然而这个编译阶段比编写和调试新的代码还要无趣。
第二,Tensorflow与Theano相比拥有更加简洁的界面。许多种类的模型在少用一些框架少写一些代码的情况下也可以被清楚的表达出来。
最后,Tensorflow的开发主要是注重于生产和使用,而Theano的设计几乎纯粹的为了研究。
因此,Tensorflow有许多开箱即用的特性,所以使它在一个真正的系统中成为更好的选择。(它在移动环境中运行的能力,使它很容易的在单个机器上跨多个GPU构建模型,并且可以在一个分布式的大规模网络中训练)
正因为这些原因,Tensorflow成为现下深度学习库的选择。总的来讲,我们选择Tensorflow是因为:
Tensorflow是新出的,但它在实业公司和研究社区中已经获得了使用,而且在深度学习库中大约有293名学生注册了课程CS20SI:“Tensorflow的深度学习研究”。意味着没有一个学生从未使用过任何深度学习库。
Tensorflow教程相比其他深度学习库的需求
用Tensorflow的公司:
Google
DeepMind
OpenAI
Snapchat
Uber
Airbus
eBay
Dropbox
许多创业公司使用Tensorflow一些很酷的项目:
DeepMind’s WaveNet技术文本转语音
谷歌大脑展示一段利用机器学习创作音乐,艺术作品的项目
谷歌翻译系统的改进
还有许多例子是世界级的项目使用Tensorflow的,从谷歌的博客我们可以看到:
1 澳大利亚海洋生物学家在使用Tensorflow找到海里成千上万个分辨率高的动物的照片,以便更好地统计它们的数量,从而可以保护那些濒临灭绝的动物。
2 利用Tensorflow训练模型,农民可以通过黄瓜的大小,形状还有其他的特征去分类进口的日本黄瓜。
3 放射科的医生可以用Tensorflow进行医学上的扫描从而确诊帕金森病。
4 数据科学家可以在海湾地区使用Tensorflow和草莓派系统实现火车的跟踪。
不酷嘛?
从单行的Tensorflow开始:
这部分很酷但不是很重要。你可以跳过这一部分。
1 TF学习(tf.contrib.learn)
Tensorflow有简化的界面,TF学习(tf.contrib.learn)提供可用的模型,用户可以简单的调用。这是为深度学习刻意创建了一个模仿sciki-learn的模型可以实现从单线机器的sciki-learn世界学习平滑过渡到更开放的可以构建不同形状的ML模型的世界。事实上,TF学习最初是一个叫做scikit flow(SKFlow)的独立项目。
TF学习允许你载入数据,建立模型,使用合适的模型训练数据,计算正确率,每一个都使用单行方式。一些能说上名字来的使用单行方式的模型在TF学习中包括线性分类,线性回归,深层神经网络分类。谷歌已经出了很好的教程教你如何使用TF学习构建自定义模型。
文档在TF学习中的深层神经网络分类中:这是一个Github上Tensorflow Examples例子中的一个TF学习的例子。
# 下载数据
iris = tf.contrib.learn.datasets.load_dataset('iris')
x_train, x_test, y_train, y_test = cross_validation.train_test_split( iris.data, iris.target, test_size=0.2, random_state=42)
# 建立三层深度神经网每层分别是10,20,10个单元
feature_columns = tf.contrib.learn.infer_real_valued_columns_from_input( x_train) classifier = tf.contrib.learn.DNNClassifier( feature_columns=feature_columns, hidden_units=[10, 20, 10], n_classes=3)
# 分类并预测
classifier.fit(x_train, y_train, steps=200) predictions = list(classifier.predict(x_test, as_iterable=True)) score = metrics.accuracy_score(y_test, predictions)
print('Accuracy: {0:f}'.format(score))
可以看到TF学习让你用一行加载数据,在另一行拆分数据,并且你可以选择建立在深度神经网络中隐藏单元的数量。在此情况下,第一层有10个隐藏单元,第二层有20个隐藏单元,第三层有10个隐藏单元。你也可以指定分类标签的个数,优化器(例如,梯度下降)的类型以及初始权重。
你可以访问TF学习示例知识库,了解更多TF学习的示例。但是,注意里面大多数建立的模型都是使用已经弃用的函数实现的,所以如果你调用它们会看到许多警告。
2 TF-Slim(tf.contrib.slim)
另一个简单的API叫做TF-Slim,它构建和训练以及评估神经网络的方式比较简化。
3 Tensorflow顶部的高级API
在Tensorflow顶部构建了许多高级的API。
包括一些最流行的API—— Keras (keras@GitHub), TFLearn (tflearn@GitHub), and Pretty Tensor(prettytensor@GitHub)。
注意:你不应该对简化TF学习界面的高级API TF学习(TF和学习之间没有空格)感到困惑。TF学习支持大部分的深度学习模型,像ConvNets, LSTM, BiRNN, ResNets, Generative networks和功能如BatchNorm,PReLU。TF学习由 Aymeric Damien开发。
Spoiler警告:Aymeric在几周里给出了客座讲座。
但是,Tensorflow的主要哦目的不是提供开箱即用的机器学习。相反,Tensorflow提供了适用度较广和函数和分类器允许用户从头开始定义模型。这更复杂,但是会更具备灵活性。你可以建立几乎你能想到的在Tensorflow中的人和架构。
数据流图:
定义中下一个关键短语是“数据流图”。这个关键短语意味着TF可以在图表中做所有的计算。请参阅第一讲的幻灯片(从23页)了解更多详情!
地址见此
会话还将分配内存来存储变量的当前值。
如您所见,我们变量的值只在一个会话内有效。如果我们在第二个会话后试图查询值,Tensorflow将引发一个错误,因为变量不是初始化的。
参考文献:
(1) https://www.tensorflow.org/
(2) “Tensorflow for Machine Intelligence”
(3) “Hands-On Machine Learning with Scikit-Learn and TensorFlow”
(4) “Fundamentals of Deep Learning”