菜鳥學tensorflow

outline

`安裝環境

`tensorflow原理簡述

`定義網路結構、啟動網路計算

`使用Variable定義模型參數,如何訓練模型

`如何測試

只是自己的簡要概括,最好對神經網路、機器學習略有了解。tensorflow的中文文檔新手入門真的做的還不錯,建議大家結合理論,碼一碼代碼,上手很快的。

`安裝環境

ubuntu 16.04,pycharm IDE、python 2.7

pycharm有教育賬戶的,學生可以免費使用。IDE集成了terminal、python console,還能調試,真的好用。另外集成了virtual environment,可以切換使用python2.7、python3.x,有興趣的可以了解一下

#note

使用virtual environment的方法

file-new project-選擇解釋器的邊上有個設置可以創建虛擬環境,選擇相應的解釋器就能創建,另外在這個project中的terminal會默認使用這個虛擬環境,形如:

(tensorflow) ceo1207@ceo1207:

安裝tensorflow

pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl

另外裝jupyter(就是常說的python notebook)體驗也很好,可以像python console中一樣互動式的編程,還能保存代碼

apt-get install python-devpython -m pip install jupyter

使用時,輸入 jupyter notebook 即可在瀏覽器中使用python

`tensorflow原理簡述

(看不懂不要緊,看完下面的再來看一遍就會了)網路結構使用Graph表示,Graph由operation(節點)組成,op接受輸入產生輸出,輸入輸出使用張量(tensor)表示,所以這個框架叫tensorflow,張量數據的流動的意思。

定義graph不會產生計算,真正的計算使用Session(會話)驅動,可以使用會話傳入數據,獲取輸入以及訓練和測試網路。

#note:計算優化

為了用python實現高效的數值計算,我們通常會使用函數庫,比如NumPy,會把類似矩陣乘法這樣的複雜運算使用其他外部語言實現。不幸的是,從外部計算切換回Python的每一個操作,仍然是一個很大的開銷。如果你用GPU來進行外部計算,這樣的開銷會更大。用分散式的計算方式,也會花費更多的資源用來傳輸數據。

TensorFlow也把複雜的計算放在python之外完成,但是為了避免前面說的那些開銷,它做了進一步完善。Tensorflow不單獨地運行單一的複雜計算,而是讓我們可以先用圖描述一系列可交互的計算操作,然後全部一起在Python之外運行。

`定義網路結構、啟動網路計算

graph定義網路結構,添加節點(計算單元)。但是graph只是定義結構和數據,真正的計算需要會話啟動。

節點構造器,接收輸入tensor,返回op的輸出。最簡單的是常量節點,可以作為整個網路的輸入。也可以是一些計算操作,比如矩陣相加、相乘。直接上代碼,看看就明白了。

import numpy as npimport tensorflow as tf# define input, create operation, result(tensor) returninput1 = tf.constant(3)input2 = tf.constant(2)input3 = tf.constant(5)# define operationsadd = tf.add(input3,input2)mul = tf.mul(input1,add)with tf.Session() as sess: # use the default graph result = sess.run([mul,add]) print result

輸入也可以使用佔位符,用於在會話時,靈活的添加自定義的輸入。

import numpy as npimport tensorflow as tfinput1 = tf.placeholder(tf.types.float32)input2 = tf.placeholder(tf.types.float32)mul = tf.mul(input1, input2)data1 = [1,2,3]data2 = [2,4,6]with tf.Session() as sess: print sess.run([mul], feed_dict={input1:data1,input2:data2})

關於數據的fetch和feed,上面兩段代碼都用到了其實。

Fetch,使用run獲取

with tf.Session(): result = sess.run([mul, intermed]) print result

需要獲取的多個 tensor 值,在 op 的一次運行中一起獲得(而不是逐個去獲取 tensor)

feed,在會話中插入數據,使用placeholder

import numpy as npimport tensorflow as tfinput1 = tf.placeholder(tf.types.float32)input2 = tf.placeholder(tf.types.float32)mul = tf.mul(input1, input2)data1 = [1,2,3]data2 = [2,4,6]with tf.Session() as sess: print sess.run([mul], feed_dict={input1:data1,input2:data2})

`使用Variable定義模型參數、如何訓練模型

到這一步,請你確保具備以下能力,給你具體的公式和輸入,可以使用tensorflow,控制數據的輸入,利用會話驅動運算獲得最後的輸出,甚至是任意中間步驟的結果。

但是常用的神經網路、機器學習的模型都是有模型參數的,模型參數是需要訓練的。參數如何輸入?當然我們可以把它們當做是另外的輸入(使用佔位符),但TensorFlow有一個更好的方法來表示它們:Variable。

Variable你可以理解為一個可變的tensor,事後,框架會根據你設置的訓練方法自動更新他的值。

#note:

模型的多種輸入:常量、佔位符、Variable

有了可變的tensor(Variable),如何訓練他們?

看懂下面的部分,先了解一下什麼是softmax regression

如下,regression解決的是分類問題,對於多分類問題,使用softmax層得到歸一化的多分類的概率分布。

概率分布:(這個詞,其實不容易解釋)多分類問題下,一個隨機事件,在各個分類上的概率分布,就是所謂的概率分布。概率分布的特點,各個分類的概率之和為1.

好吧,不了解你就硬著頭皮往下看吧,沒什麼關係。

首先定義優化的目標,即確定loss function。

多分類問題採用交叉熵作為loss,形如:

cross_entropy = -tf.reduce_sum(y_*tf.log(y))

再確定優化的方法,可以使用常用的梯度下降方法

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

設置步長為0.01,優化目標是cross_entropy

好了,可以看mnist的實戰代碼了,可以在tensorflow github上看,這裡貼一下

"""A very simple MNIST classifier.See extensive documentation athttps://www.tensorflow.org/get_started/mnist/beginners"""from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport argparseimport sysfrom tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tfFLAGS = Nonedef main(_): # Import data mnist = input_data.read_data_sets(FLAGS.data_dir) # Create the model x = tf.placeholder(tf.float32, [None, 784]) W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) y = tf.matmul(x, W) + b # Define loss and optimizer y_ = tf.placeholder(tf.int64, [None]) # The raw formulation of cross-entropy, # # tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.nn.softmax(y)), # reduction_indices=[1])) # # can be numerically unstable. # # So here we use tf.losses.sparse_softmax_cross_entropy on the raw # outputs of y, and then average across the batch. cross_entropy = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y) train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) sess = tf.InteractiveSession() tf.global_variables_initializer().run() # Train for _ in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # Test trained model correct_prediction = tf.equal(tf.argmax(y, 1), y_) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print(sess.run( accuracy, feed_dict={ x: mnist.test.images, y_: mnist.test.labels }))if __name__ == __main__: parser = argparse.ArgumentParser() parser.add_argument( --data_dir, type=str, default=/tmp/tensorflow/mnist/input_data, help=Directory for storing input data) FLAGS, unparsed = parser.parse_known_args() tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

`如何測試

最後說一下如何測試,其實上面的代碼以及中文文檔里已經說的蠻好了。

好吧,下一篇,深入mnist(讀作m-nist),明兒見


推薦閱讀:

不要慫,就是GAN (生成式對抗網路) (三):判別器和生成器 TensorFlow Model
深度學習框架TensorFlow學習筆記(1)
Softmax函數與交叉熵
C++運行TensorFlow模型
如何看待tensorflow新出的eager模式?

TAG:深度學習DeepLearning | TensorFlow | 計算機視覺 |