TensorFlow
概述
TensorFlow是Google主导的开源深度学习库。官网:
代码:
https://github.com/tensorflow/tensorflow
TensorFlow提供了一个可视化的神经网络展示:
http://playground.tensorflow.org/
还有若干已经实现好的经典神经网络模型(比如Autoencoder、ResNet等):
https://github.com/tensorflow/models/
TensorFlow的官方教程:
http://tensorflowtutorial.net/tensorflow-tutorial
教程中文版:
http://wiki.jikexueyuan.com/project/tensorflow-zh/
TensorFlow中文社区:
另一个API中文版:
https://www.w3cschool.cn/tensorflow_python/
安装:
sudo pip install tensorflow
由于我的PC显卡不合要求,因此直接安装的是CPU版本,这也是最通用的版本。
TensorFlow技术栈:
CS 20SI
斯坦福最近专门为Tensorflow开设了一门课程:CS 20SI: Tensorflow for Deep Learning Research。
网址:
https://web.stanford.edu/class/cs20si/syllabus.html
课程的主讲Chip Huyen,一个越南妹子,目前在斯坦福读本科(大三)。应该说本科生上讲台的确是一件稀罕事,在这里为斯坦福的学术氛围点赞。
个人主页:
不用为课程的质量担心,Chip Huyen的师兄们客串了很多节课,Andrej Karpathy为课程设计了网页。
Chip Huyen可谓是一战成名。但也带来了烦恼,再去请教别人的时候,总有助教或同学会反问:“这些你不该早就知道了么?你不就是教这些的么?”
参见:
http://www.sohu.com/a/164277987_473283
一名在斯坦福教授TensorFlow教师的“忏悔”:我觉得自己像个骗子
源代码编译
Step 1:安装Bazel。
echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install bazel
Bazel的官网文档:
https://docs.bazel.build/versions/master/bazel-user-manual.html
Step 2:编译TensorFlow。
./configure
# configure的时候要选择一些东西是否支持,这里建议都选N,不然后面会包错,如果支持显卡,就在cuda的时候选择y
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package # CPU only
bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package # GPU
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg #生成wheel文件
configure脚本会自动选择CPU指令集优化,因此源代码编译的TensorFlow,肯定比pip安装的要运行的快。
bazel编译相当消耗资源,在配置低的机器上,可通过如下选项限制使用资源的数量。(最常出现的后果是内存耗尽导致的假死。)
--jobs n --local_resources availableRAM(MB),availableCPU,availableIO
例子:
bazel build --jobs 2 --local_resources 850,3.0,1.0 --config=opt //tensorflow/tools/pip_package:build_pip_package
按照我的实践--local_resources
其实用处不大,有的C++文件编译需要上GB空间,即使有约束也会突破。而--jobs
相对好一些,一般按照每个job 1.5GB来估算,就可以保证TensorFlow顺利编译成功。
Step 3:安装TensorFlow。
sudo pip uninstall tensorflow
sudo pip install /tmp/tensorflow_pkg/tensorflow-1.3.0-cp27-cp27mu-linux_x86_64.whl
加入CPU指令集优化之后的版本,要比通用版快50%~100%,因此,编译源码安装还是很有价值的。
参考:
http://www.jianshu.com/p/b1faa10c9238
TensorFlow CPU环境SSE/AVX/FMA指令集编译
http://www.hankcs.com/ml/compile-and-install-tensorflow-from-source.html
从源码编译安装TensorFlow
http://blog.csdn.net/sinat_28731575/article/details/74633476
Mac下使用源码编译安装TensorFlow CPU版本
基本概念
Variables:维持计算图执行过程中的状态信息的变量。一般来说,这就是神经网络的参数。
Placeholders:对于每个样本都不相同的变量。比如神经网络的输入变量x和输出变量y。
声明:
x = tf.placeholder(tf.float32, [None, 784])
Placeholders在图的执行过程中,需要由真实的tensor填充之:
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
这里的batch_xs就是用来填充x的tensor。
图计算
图计算是各个深度学习框架的中心概念,这里单独提出来讨论一下。
上图是softmax运算的计算图示例。计算图是一个有向无环图,它的结点代表原始数据和计算中间结果,边代表数据的流向。计算操作被称为Operation。
因此,计算图实际上是工作流(work flow)思想在数值计算领域的拓展。这种流水线一般被称为Graph。
流水线有了,还要有被加工的数据。数据在流水线上被加工的执行过程,被称为Session。
Graph和Session的关系,类似于类和对象的关系。Session是Graph的动态实例。
图计算的大致步骤如下:(这里以OpenVX函数为例,因为它更接近底层和硬件。)
1.vxCreateGraph。创建计算图。
2.vxProcessGraph。运行计算图。
在大多数Tensorflow示例中,你看不到Graph的身影。但它并不是不存在,而是默认所有新加入的Operation都添加到默认的Graph。
以下是使用多个Graph的示例:
import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
c1 = tf.constant([1.0])
with tf.Graph().as_default() as g2:
c2 = tf.constant([2.0])
with tf.Session(graph=g1) as sess1:
print sess1.run(c1)
with tf.Session(graph=g2) as sess2:
print sess2.run(c2)
Tensorflow对计算图的简化,不仅在于使用默认的Graph。还在于可以只计算部分的Graph。以上面的softmax运算为例,如果sess.run(add)
的话,后面的ReLU和softmax运算都不会被执行。
虽然图计算是Tensorflow的主要使用方式,然而一般性的tensor计算(即非图计算),也是完全可行的。Tensorflow没有提供相关的API,直接使用numpy就可以了。
下面的动图形象的展示了计算图的前向和后向运算的过程:
参考:
http://www.algorithmdog.com/dynamic-tensorflow
动态图计算:Tensorflow 第一次清晰地在设计理念上领先
https://zhuanlan.zhihu.com/p/23932714
YJango的TensorFlow整体把握
http://www.cnblogs.com/lienhua34/p/5998853.html
Tensorflow学习笔记2:About Session, Graph, Operation and Tensor
Fused Graph
Fused Graph是TensorFlow新推出的概念。这里仍以softmax运算为例,讲一下它的基本思想。
上面的softmax运算计算图中,总共有4个operation。Fused Graph则将这4个op整合为1个op,发给运算单元。
这样不同的硬件厂商就可以自行对这个整合的op进行解释。功能强的硬件,可能直接就支持softmax运算。功能弱的硬件也不怕,反正总归可以将softmax分解为基本运算的。
Qualcomm Hexagon平台的Fused Graph实现可参见:
tensorflow/core/kernels/hexagon
上图是另一个计算图优化的例子。
参考:
https://developers.googleblog.com/2017/03/xla-tensorflow-compiled.html
XLA - TensorFlow, compiled
Eigen
Eigen是一个线性代数方面的C++模板库。tensorflow和caffe2都使用了这个库。
官网:
参见:
https://zhuanlan.zhihu.com/p/26512099
tensorflow和caffe2
TensorFlow高层封装
目前对TensorFlow的封装如下所示:
1.TensorFlow-Slim。主要提供了层一级的封装。粒度和OpenVX类似。
2.tf.contrib.learn(之前也被称为skflow)。提供了类似sklearn的接口。
前2个是TensorFlow自带的封装
3.第三个是TFLearn。在tf.contrib.learn上的封装。需单独安装:
sudo pip install tflearn
4.Keras。
5.TensorLayer。这个的封装粒度介于TensorFlow-Slim和TFLearn之间。
http://tensorlayer.readthedocs.io/en/latest/user/tutorial.html
6.Pretty Tensor。来自google的TensorFlow封装。
https://github.com/google/prettytensor
7.Sonnet。来自Deepmind的TensorFlow封装。
https://github.com/deepmind/sonnet
参见:
http://www.infoq.com/cn/articles/introduction-of-tensorflow-part06
深入浅出TensorFlow(六)TensorFlow高层封装
Slim
代码:
tensorflow/contrib/slim
示例:
https://github.com/mnuke/tf-slim-mnist
参见:
http://geek.csdn.net/news/detail/126133
如何用TensorFlow和TF-Slim实现图像分类与分割
实战心得:
tf-slim-mnist例子中mnist数据不是原始格式的,而是经过了datasets/download_and_convert_mnist.py
的转换。
该示例执行时也没有控制台的输出信息,一度让我觉得很不方便。后来才发现,原来可以用TensorBoard查看log文件夹。
TensorBoard是一个http服务,用以监控TensorFlow的执行。
tensorboard --logdir=log
启动之后,用浏览器打开http://localhost:6006
即可。
模型文件
tensorflow model包含2个文件:
a)Meta graph:
使用protocol buffer来保存整个tensorflow graph.例如所有的variables, operations, collections等等。这个文件使用.meta后缀。
b) Checkpoint file:
二进制文件包含所有的weights,biases,gradients和其他variables的值。这个文件使用.ckpt后缀,有2个文件:
mymodel.data-00000-of-00001
mymodel.index
.data文件就是保存训练的variables我们将要使用它。
和这些文件一起,tensorflow还有一个文件叫checkpoint用来简单保存最近一次保存checkpoint文件的记录。
保存模型
w1 = tf.Variable(tf.random_normal(shape=[2]), name='w1')
w2 = tf.Variable(tf.random_normal(shape=[5]), name='w2')
saver = tf.train.Saver()
sess = tf.Session()
sess.run(tf.global_variables_initializer())
saver.save(sess, 'my_test_model')
加载模型
new_saver = tf.train.import_meta_graph('my_test_model-1000.meta')
new_saver.restore(sess, tf.train.latest_checkpoint('./‘))
参考:
http://www.cnblogs.com/azheng333/archive/2017/06/09/6972619.html
Tensorflow模型保存和加载
http://blog.csdn.net/wiinter_fdd/article/details/72821923
Tensorflow中的模型持久化
TFRecord
TFRecord是TensorFlow官方定义的存放样本数据文件。
参考:
http://www.cnblogs.com/antflow/p/7299029.html
TFRecord的使用
https://zhuanlan.zhihu.com/p/27481108
TensorFlow直接读取图片和读写TFRecords速度对比
多核(multicore),多线程(multi-thread)
在Tensorflow程序中,我们会经常看到”with tf.device(“/cpu:0”): “ 这个语句。单独使用这个语句,而不做其他限制,实际上默认tensorflow程序占用所有可以使用的内存资源和CPU核。
参考:
http://deepnlp.org/blog/tensorflow-parallelism/
Tensorflow并行:多核(multicore),多线程(multi-thread)