TensorFlow(一)
TensorFlow
概述
TensorFlow是Google主導的開源深度學習庫。官網:
https://www.tensorflow.org/
代碼:
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中文社區:
http://www.tensorfly.cn/
另一個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,一個越南妹子,目前在斯坦福讀本科(大三)。應該說本科生上講臺的確是一件稀罕事,在這里為斯坦福的學術氛圍點贊。
個人主頁:
https://huyenchip.com
不用為課程的質量擔心,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 bazelBazel的官網文檔:
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都使用了這個庫。
官網:
http://eigen.tuxfamily.org/
參見:
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
http://tflearn.org/
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)
總結
以上是生活随笔為你收集整理的TensorFlow(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DL参考资源(二)
- 下一篇: 机器学习(二十二)——推荐算法中的常用排