斯坦福课程“CS 20SI:TensorFlow for Deep Learning Research”中文讲义(1)

课程网站:http://web.stanford.edu/class/cs20si/index.html

讲义1:TensorFlow简介

翻译:弓小长

“CS 20SI:TensorFlowfor Deep Learning Research”(cs20si.stanford.edu)

由Chip Huyen编写([email protected]

审校:Danijar Hafner,JonGautier,Minh-Thang Luong,PaulWarren


编写“TensorFlowfor Machine Intelligence”一书的人为TensorFlow的存在给了一个很好的理由,这也是我要引用的:“虽然深度学习背后的数学概念已经存在了数十年,但致力于创建和训练这些深度模型的编程库在近几年才刚刚起步。”


不幸的是,大部分编程库在灵活性和生产价值之间有很大的折衷。灵活的库对于研究新的模型体系结构来说是非常宝贵的,但这些库要么太慢,要么不能用于工业生产。另一方面,已经出现了可以在分布式硬件上托管的快速、高效的库,但是它们通常用于特定的神经网络,并且不适于研究新的和更好的模型。这将决策者带入了两难的困境:我们应该用不灵活的库进行研究以便我们不必重新实现代码,还是应该用一个库进行研究而用另一个完全不同的库来进行生产?如果选择前者,我们可能无法检验出不同类型的神经网络模型; 如果我们选择后者,我们必须维护这些可能完全不同的API的代码。我们是否有这方面的资源?


TensorFlow的目标是解决这个困境。


那么什么是TensorFlow?


TensorFlow最初是作为内部机器学习工具由Google创建的,2015年11月在Apache 2.0许可下发布开源版本。为了更好地理解什么是TensorFlow,让我们来看看它的创建者对它的看法。


在TensorFlow的网站上,我们看到:


标语:机器智能的开源软件库。

定义:TensorFlow™是使用数据流图进行数值计算的开源软件库。


我们可以看到TensorFlow是开源的。但是请注意,我们在GitHub上看到的只有TensorFlow的实现是开源的,Google仍拥有TensorFlow的内部版本。据说,谷歌这么做是因为TensorFlow与其他内部工具之间有复杂关系,而并非Google“囤积好东西”。我们希望最好是这样。


我们留意到另一个关键词,TensorFlow是“机器智能软件库”。它是大公司开发的十几个机器智能库之一,可能是最新的一个。 当前深度学习库的列表,请访问此链接


为什么是TensorFlow?


有这么多库,为什么我们这门课要教授TensorFlow?


我们选择库的第一个标准是这个库是流行的。根据我们在斯坦福大学同行中的观察,这些深度学习库列表中有四个库是最流行,分别是Theano,Torch和TensorFlow。


Torch框架是用Lua编写的,这是一种很棒的语言,但不幸的是我们并不熟悉这个语言,在游戏开发社区和深度学习社区之外,它也不是很流行。


对Theano而言,“Fundamentals of Deep Learning(深度学习基础)”一书对TensorFlow和Theano做了一个很好的比较:“首先,Theano有一个额外的”图形编辑“步骤,在创建某种深度学习架构时会花费大量的时间。与训练时间相比,这个编译阶段虽然很小,但是在编写和调试新代码的时候它还是很令人沮丧的。其次,与Theano相比,TensorFlow拥有更干净的界面。在不牺牲框架表现力的情况下,很多种类的模型可以用更少的行来表示。最后,TensorFlow立足于工业应用,而Theano是由研究人员几乎纯粹为研究目的而设计的。因此,TensorFlow拥有许多开箱即用的功能,使其成为真实系统的更好选择(能够在移动环境中运行,单机多GPU上轻松构建模型,并且可以训练大规模的分布式网络)。出于这些原因,TensorFlow成为了深度学习的首选库。


总之,我们选择了TensorFlow,因为:


  • Python API
  • 可移植性:使用单个API将计算部署到桌面(或服务器、移动设备)中的一个或多个CPU(或GPU)
  • 灵活性:从Raspberry Pi,Android,Windows,iOS,Linux到服务器群
  • 可视化(TensorBoard is da bomb)
  • 检查点(用于管理实验)
  • 自动分化autodiff(不再需要手工)
  • 大型社区(一年内> 10,000次的评论和超过3000次的与TF相关的提问)
  • 已经使用TensorFlow的令人敬畏的项目


TensorFlow是新的,但它已经在工业界和学术界获得了关注。下面是注册了CS20SI课程的293名学生使用深度学习库的情况。其中,“None”意味着从未使用过任何深度学习库。


斯坦福课程“CS 20SI:TensorFlow for Deep Learning Research”中文讲义(1)

图1 293名学生使用深度学习库的情况


斯坦福课程“CS 20SI:TensorFlow for Deep Learning Research”中文讲义(1)

图2学生对不同深度学习库教程的需求图


使用TensorFlow的公司:


  • Google
  • DeepMind
  • OpenAI
  • Snapchat
  • Uber
  • Airbus
  • eBay
  • Dropbox
  • 一大堆初创公司


一些使用TensorFlow的酷项目:


  • DeepMind的WaveNet文本转语音
  • Google Brain的Magenta项目,利用机器学习创造引人注目的艺术和音乐
  • 神经风格翻译
  • Google翻译的重大改进


使用TensorFlow的真实项目示例,取自GoogleResearch Blog,2016:

  • 澳大利亚海洋生物学家正在使用TensorFlow从成千上万章高分辨率照片中来查找濒临灭绝的海牛,以便更好的理解海牛群体。
  • 一个日本农场主用TensorFlow训练了一个模型来排列黄瓜的大小,形状和其他特征。
  • 放射科医师采用TensorFlow来从医学图像中识别帕金森病的迹象。
  • 湾区的数据科学家已经安装了TensorFlow和Raspberry Pi来跟踪Caltrain。


这不是很酷吗?


开始使用单行TensorFlow


这部分很酷,但不是那么重要。 你可以跳过单行TensorFlow的世界。


1. TF Learn(tf.contrib.learn)


TensorFlow有一个简化的界面,即TF Learn(TensorFlow.contrib.learn),提供了用户可以直接调用的现成模型。这是为了模仿scikit-learn而创建的,目的是为了平滑从单行机器学习的scikit-learn世界向构建不同机器学习模型的更加开放的世界的过渡。实际上,TF Learn最初是一个名为Scikit Flow(SKFlow)的独立项目。


TF Learn允许加载数据,构建模型,使用训练数据拟合模型,评估准确性,而这每一步只需一行代码即可实现。你可以使用一行代码调用的TF Learn模型包括LinearClassifier,LinearRegressor,DNNClassifier。Google有非常好的教程,介绍如何使用TF Learn构建自定义模型。


TFLearn中的DNNClassifier文档:GitHub上TF Learn的一个例子。


iris.py

# Load dataset.加载数据集

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)

# Build 3 layer DNN with 10, 20, 10 units respectively.创建包含10,20,10个单元的三层DNN

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)

# Fit and predict.拟合模型并预测

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 Learn允许使用一行代码加载数据,一行代码将数据进行拆分,并且可以调用内置的DNNClassifier来创建用户指定隐藏单位数目的深度神经网络分类器。 在这种情况下,第一层有10个隐藏单元,第二层有20个隐藏单元,第三层有10个隐藏单元。 你还可以指定标签类的数量,优化方法(例如,梯度下降)或初始权重。


你可以访问TFLearn示例资料库以获取更多TF Learn的示例。 但是,请记住,大多数内置模型都是使用不推荐使用的函数来实现的,所以如果你调用它们,你会看到很多警告。


2. TF-Slim(tf.contrib.slim)


另一个简单的称为TF-Slim的API来简化构建、训练和评估神经网络。


3.*TensorFlow上的高级API


在TensorFlow之上建立了许多高层次的API。一些最流行的API包括Keras(keras @ GitHub),TFLearn(tflearn @ GitHub)和Pretty Tensor(prettytensor @ GitHub的)。


注意:不要将高级APITFLearn(TF和Learn之间没有空格)与简化的界面TF Learn混淆。 TFLearn支持最近的大多数深度学习模型,例如ConvNets,LSTM,BiRNN,ResNets,生成网络和BatchNorm,PReLU等特征。 TFLearn由AymericDamien开发。


剧透警报:Aymeric将在几个星期内作为嘉宾授课!


但是,TensorFlow的主要目的不是提供开箱即用的机器学习解决方案。相反,TensorFlow提供了广泛的函数和类,允许用户从头开始定义模型。这更复杂,但提供更多的灵活性。


你可以在TensorFlow中构建几乎所有你能想到的架构。


数据流图


定义中的另一个关键词是“数据流图”。 这个关键词意味着TF在图中完成所有的计算。


请参阅第一讲的幻灯片(从第23页开始)了解更多详情!

http://danijar.com/what-is-a-TensorFlow-session/


会话还将分配内存来存储变量的当前值。


正如你所看到的,我们的变量的值只在一个会话中有效。如果我们试图在第二个会话中查询这个值,TensorFlow会产生一个错误,因为这个变量没有在那里初始化。


参考文献:

[1]https://www.TensorFlow.org/

[2]“TensorFlow for Machine Intelligence”

[3]“Hands-On Machine Learning with Scikit-Learn and TensorFlow”. Chapter 9: Up andrunning with TensorFlow

[4] “Fundamentalsof Deep Learning”. Chapter 3: Implementing Neural Networks in TensorFlow.