tensorflow是google在2015年開源的深度學習框架,能夠很方便的檢驗算法效果。這兩天看了看官方的tutorial,極客學院的文檔,以及綜合tensorflow的源碼,把本身的心得整理了一下,做爲本身的備忘錄。python
tensorflow筆記系列:
(一) tensorflow筆記:流程,概念和簡單代碼註釋
(二) tensorflow筆記:多層CNN代碼分析
(三) tensorflow筆記:多層LSTM代碼分析
(四) tensorflow筆記:經常使用函數說明
(五) tensorflow筆記:模型的保存與訓練過程可視化
(六)tensorflow筆記:使用tf來實現word2vec算法
tensorflow的運行流程主要有2步,分別是構造模型和訓練。數組
在構造模型階段,咱們須要構建一個圖(Graph)來描述咱們的模型。所謂圖,也能夠理解爲流程圖,就是將數據的輸入->中間處理->輸出的過程表示出來,就像下面這樣。 session
注意此時是不會發生實際運算的。而在模型構建完畢之後,會進入訓練步驟。此時纔會有實際的數據輸入,梯度計算等操做。那麼,如何構建抽象的模型呢?這裏就要提到tensorflow中的幾個概念:Tensor,Variable,placeholder,而在訓練階段,則須要介紹Session。下面先解釋一些上面的幾個概念數據結構
Tensor的意思是張量,不過按個人理解,其實就是指矩陣。也能夠理解爲tensorflow中矩陣的表示形式。Tensor的生成方式有不少種,最簡單的就如app
import tensorflow as tf # 在下面全部代碼中,都去掉了這一行,默認已經導入 a = tf.zeros(shape=[1,2])
不過要注意,由於在訓練開始前,全部的數據都是抽象的概念,也就是說,此時a只是表示這應該是個1*5的零矩陣,而沒有實際賦值,也沒有分配空間,因此若是此時print,就會出現以下狀況:框架
print(a) #===>Tensor("zeros:0", shape=(1, 2), dtype=float32)
只有在訓練過程開始後,才能得到a的實際值函數
sess = tf.InteractiveSession()
print(sess.run(a)) #===>[[ 0. 0.]]
這邊設計到Session概念,後面會提到學習
故名思議,是變量的意思。通常用來表示圖中的各計算參數,包括矩陣,向量等。例如,我要表示上圖中的模型,那表達式就是 測試
(relu是一種激活函數,具體可見這裏)這裏W和b是我要用來訓練的參數,那麼此時這兩個值就能夠用Variable來表示。Variable的初始函數有不少其餘選項,這裏先不提,只輸入一個Tensor也是能夠的
W = tf.Variable(tf.zeros(shape=[1,2]))
注意,此時W同樣是一個抽象的概念,並且與Tensor不一樣,Variable必須初始化之後纔有具體的值。
tensor = tf.zeros(shape=[1,2]) variable = tf.Variable(tensor) sess = tf.InteractiveSession() # print(sess.run(variable)) # 會報錯 sess.run(tf.initialize_all_variables()) # 對variable進行初始化 print(sess.run(variable)) #===>[[ 0. 0.]]
又叫佔位符,一樣是一個抽象的概念。用於表示輸入輸出數據的格式。告訴系統:這裏有一個值/向量/矩陣,如今我無法給你具體數值,不過我正式運行的時候會補上的!例如上式中的x和y。由於沒有具體數值,因此只要指定尺寸便可
x = tf.placeholder(tf.float32,[1, 5],name='input') y = tf.placeholder(tf.float32,[None, 5],name='input')
上面有兩種形式,第一種x,表示輸入是一個[1,5]的橫向量。
而第二種形式,表示輸入是一個[?,5]的矩陣。那麼什麼狀況下會這麼用呢?就是須要輸入一批[1,5]的數據的時候。好比我有一批共10個數據,那我能夠表示成[10,5]的矩陣。若是是一批5個,那就是[5,5]的矩陣。tensorflow會自動進行批處理
session,也就是會話。個人理解是,session是抽象模型的實現者。爲何以前的代碼多處要用到session?由於模型是抽象的嘛,只有實現了模型之後,纔可以獲得具體的值。一樣,具體的參數訓練,預測,甚至變量的實際值查詢,都要用到session,看後面就知道了
這裏咱們使用官方tutorial中的mnist數據集的分類代碼,公式能夠寫做
那麼該模型的代碼描述爲
# 創建抽象模型 x = tf.placeholder(tf.float32, [None, 784]) # 輸入佔位符 y = tf.placeholder(tf.float32, [None, 10]) # 輸出佔位符(預期輸出) W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) a = tf.nn.softmax(tf.matmul(x, W) + b) # a表示模型的實際輸出 # 定義損失函數和訓練方法 cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(a), reduction_indices=[1])) # 損失函數爲交叉熵 optimizer = tf.train.GradientDescentOptimizer(0.5) # 梯度降低法,學習速率爲0.5 train = optimizer.minimize(cross_entropy) # 訓練目標:最小化損失函數
能夠看到這樣以來,模型中的全部元素(圖結構,損失函數,降低方法和訓練目標)都已經包括在train裏面。咱們能夠把train叫作訓練模型。那麼咱們還須要測試模型
correct_prediction = tf.equal(tf.argmax(a, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
上述兩行代碼,tf.argmax表示找到最大值的位置(也就是預測的分類和實際的分類),而後看看他們是否一致,是就返回true,不是就返回false,這樣獲得一個boolean數組。tf.cast將boolean數組轉成int數組,最後求平均值,獲得分類的準確率(怎麼樣,是否是很巧妙)
有了訓練模型和測試模型之後,咱們就能夠開始進行實際的訓練了
sess = tf.InteractiveSession() # 創建交互式會話 tf.initialize_all_variables().run() # 全部變量初始化 for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) # 得到一批100個數據 train.run({x: batch_xs, y: batch_ys}) # 給訓練模型提供輸入和輸出 print(sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}))
能夠看到,在模型搭建完之後,咱們只要爲模型提供輸入和輸出,模型就可以本身進行訓練和測試了。中間的求導,求梯度,反向傳播等等繁雜的事情,tensorflow都會幫你自動完成。
實際操做中,還包括了獲取數據的代碼
"""A very simple MNIST classifier. See extensive documentation at http://tensorflow.org/tutorials/mnist/beginners/index.md """ from __future__ import absolute_import from __future__ import division from __future__ import print_function # Import data from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf flags = tf.app.flags FLAGS = flags.FLAGS flags.DEFINE_string('data_dir', '/tmp/data/', 'Directory for storing data') # 把數據放在/tmp/data文件夾中 mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) # 讀取數據集 # 創建抽象模型 x = tf.placeholder(tf.float32, [None, 784]) # 佔位符 y = tf.placeholder(tf.float32, [None, 10]) W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) a = tf.nn.softmax(tf.matmul(x, W) + b) # 定義損失函數和訓練方法 cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(a), reduction_indices=[1])) # 損失函數爲交叉熵 optimizer = tf.train.GradientDescentOptimizer(0.5) # 梯度降低法,學習速率爲0.5 train = optimizer.minimize(cross_entropy) # 訓練目標:最小化損失函數 # Test trained model correct_prediction = tf.equal(tf.argmax(a, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # Train sess = tf.InteractiveSession() # 創建交互式會話 tf.initialize_all_variables().run() for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) train.run({x: batch_xs, y: batch_ys}) print(sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}))
獲得的分類準確率在91%左右
轉載來自:http://blog.csdn.net/u014595019/article/details/52677412