Google第二代人工智慧平台Tensorflow初探
寫在前面:
人工智慧 已經成為了時下最火熱的 Topic。相信很多developer都在密切關注這一領域,也想要涉入並分一杯羹。但是,由於人工智慧對於數學、物理、生物等等領域專業知識的需求,著實讓很多嘗鮮者碰了不少弊。我也是這其中的一個。
每當查閱一些資料,興緻勃勃地準備學習人工智慧時,都被各種數學概率理論和演算法公式繞的雲里霧裡,對於貝葉斯分類器、邏輯回歸等等理論的欠缺,著實讓我一次次拿起,又一次次放下。所以這個學習過程一直被擱置了很久。
每次當看到人工智慧領域新的動態出現的時候,又不自覺打開了搜索引擎進行搜索,卻又被softmax回歸等等 打擊了。
但是,為了能夠在下個時代(AI時代)更好的生存,絕不能放棄。因此,還是硬著頭皮啃起來。本文中很多概念著實很生澀,我自己也沒有很好理解了,但是這確實是一種解決問題的方式。
本文只是幫助你對人工智慧平台 - Tensorflow 有一個簡單的基礎了解,後續繼續深入。
TensorFlow? 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯繫的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平台上展開計算,例如台式計算機中的一個或多個CPU(或GPU),伺服器,移動設備等等。TensorFlow 最初由Google大腦小組(隸屬於Google機器智能研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網路方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。
常用於圖像處理 和 語音識別等等領域,是目前最火熱的機器學習的平台。
一、安裝 基於mac
1.1 安裝包括 pip(Python Package Index)的安裝 和 virtualenv(virtualenv 15.1.0)虛擬容器的安裝
sudo easy_install pip # 如果還沒有安裝 pipsudo pip install --upgrade virtualenv
1.2 建立一個全新的 virtualenv 環境
virtualenv --system-site-packages ~/tensorflowcd ~/tensorflow
1.3 激活 tensorflow
source bin/activate
(tensorflow)$ # 終端提示符應該發生變化
1.4 在 virtualenv 內, 安裝 TensorFlow
TensorFlow的Python的API是2.7,最簡單的方式就是在MAC或者Unix上使用pip命令導入。
# Linux# For CPU-only version$ pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl# For GPU-enabled version (only install this version if you have the CUDA sdk installed)$ pip install https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl# Mac OS X# Only CPU-version is available at the moment.$ pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl
終端輸出:
Successfully installed numpy-1.13.3 six-1.11.0 tensorflow-0.5.0
1.5 停用virtualenv
(tensorflow)$ deactivate # 停用 virtualenv
二、使用python運行第一個tensorflow程序
打開一個 python 終端:
$ python>>> import tensorflow as tf>>> hello = tf.constant(Hello, TensorFlow!)>>> sess = tf.Session()>>> print sess.run(hello)Hello, TensorFlow!>>> a = tf.constant(10)>>> b = tf.constant(32)>>> print sess.run(a+b)42>>>exit()
三、基本概念介紹
3.1 計算圖
TensorFlow 程序通常被組織成一個構建階段和一個執行階段. 在構建階段, op 的執行步驟 被描述成一個圖. 在執行階段, 使用會話執行執行圖中的 op.
1> 構建圖
首先要構建源(op),源是一些不可變數,比如常量,源 op 的輸出被傳遞給其它 op 做運算。
TensorFlow Python 庫有一個默認圖 (default graph)
import tensorflow as tf# 創建一個常量 op, 產生一個 1x2 矩陣. 這個 op 被作為一個節點# 加到默認圖中.## 構造器的返回值代表該常量 op 的返回值.matrix1 = tf.constant([[3., 3.]])# 創建另外一個常量 op, 產生一個 2x1 矩陣.matrix2 = tf.constant([[2.],[2.]])# 創建一個矩陣乘法 matmul op , 把 matrix1 和 matrix2 作為輸入.# 返回值 product 代表矩陣乘法的結果.product = tf.matmul(matrix1, matrix2)
2> 啟動圖
步驟1中,我們構建了一個圖,步驟2中,我們調用 session類(TensorFlow 官方文檔中文版 創建一個 session對象 用於啟動圖
# 啟動默認圖.sess = tf.Session()# 調用 sess 的 run() 方法來執行矩陣乘法 op, 傳入 product 作為該方法的參數. # 上面提到, product 代表了矩陣乘法 op 的輸出, 傳入它是向方法表明, 我們希望取回# 矩陣乘法 op 的輸出.## 整個執行過程是自動化的, 會話負責傳遞 op 所需的全部輸入. op 通常是並發執行的.# # 函數調用 run(product) 觸發了圖中三個 op (兩個常量 op 和一個矩陣乘法 op) 的執行.## 返回值 result 是一個 numpy `ndarray` 對象.result = sess.run(product)print result# ==> [[ 12.]]# 任務完成, 關閉會話.sess.close()也可以使用 with 語句來使用 Session,這樣就不用定義一個變數保存 session對象with tf.Session() as sess: result = sess.run([product]) print result
3.2 Tensor(張量)
TensorFlow 程序使用 tensor 數據結構來代表所有的數據, 計算圖中, 操作間傳遞的數據都是 tensor. 你可以把 TensorFlow tensor 看作是一個 n 維的數組或列表. 一個 tensor 包含一個靜態類型 rank, 和 一個 shape.
變數 - 維護圖 執行過程 中的 狀態信息
# 創建一個變數, 初始化為標量 0.state = tf.Variable(0, name="counter")# 創建一個 op, 其作用是使 state 增加 1one = tf.constant(1)new_value = tf.add(state, one)update = tf.assign(state, new_value)# 啟動圖後, 變數必須先經過`初始化` (init) op 初始化,# 首先必須增加一個`初始化` op 到圖中.init_op = tf.initialize_all_variables()# 啟動圖, 運行 opwith tf.Session() as sess: # 運行 init op sess.run(init_op) # 列印 state 的初始值 print sess.run(state) # 運行 op, 更新 state, 並列印 state for _ in range(3): sess.run(update) print sess.run(state)
# 輸出:
# 0
# 1
# 2
# 3
3.3 Fetch
獲取多個sess.run()的值
#!/usr/bin/pythonimport tensorflow as tfinput1 = tf.constant(1)input2 = tf.constant(2)input3 = tf.constant(3)add_val = tf.add(input1 , input2)mul_val = tf.mul(input3 , add_val)init_op = tf.initialize_all_variables()with tf.Session() as sess: res = sess.run([mul_val , add_val]) print res
3.4 Feed 填充
feed 使用一個 tensor 值臨時替換一個操作的輸出結果. 你可以提供 feed 數據作為 run() 調用的參數. feed 只在調用它的方法內有效, 方法結束, feed 就會消失. 最常見的用例是將某些特殊的操作指定為 "feed" 操作, 標記的方法是使用 tf.placeholder() 為這些操作創建佔位符.
#!/usr/bin/pythonimport tensorflow as tfinput1 = tf.placeholder(tf.types.float32)input2 = tf.placeholder(tf.types.float32)mul_val = tf.mul(input1 , input2)init_op = tf.initialize_all_variables()with tf.Session() as sess: print sess.run([mul_val], feed_dict={input1:[7.], input2:[2.]})
四、MNIST 機器學習入門 -- 預測圖片中的數字
4.1、構建 softmax 回歸模型:
1> 下載對應的 數據集
2> 實現softmax回歸演算法:
#!/usr/bin/pythonimport tensorflow as tf## 導入數據集#import input_datamnist = input_data.read_data_sets("MNIST_data/", one_hot=True)## 實現回歸模型## 這裡的 None 表示此張量的第一個維度可以是任何長度的x = tf.placeholder(float , [None , 784])# 用全為零的張量來初始化W和b 因為我們要學習W 和 b的值,所以它們的值可以隨意設置W = tf.Variable(tf.zeros([784 , 10]))b = tf.Variable(tf.zeros([10]))# 建立回歸y = tf.nn.softmax(tf.matmul(x , W) + b)## 訓練回歸模型## 計算交叉熵y_ = tf.placeholder(float , [None , 10])cross_entropy = -tf.reduce_sum(y_*tf.log(y))# 用梯度下降演算法(gradient descent algorithm)以 0.01 的學習速率 最小化交叉熵train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)init = tf.initialize_all_variables()sess = tf.Session()sess.run(init)for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})## 評估模型## tf.argmax(y,1)返回的是模型對於任一輸入x預測到的標籤值,而 tf.argmax(y_,1) 代表正確的標籤,我們可以用 tf.equal來檢測我們的預測是否真實標籤匹配(索引位置一樣表示匹配)correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
4.2、構建一個多層卷積神經網路
利用softmax回歸實現的圖片識別例子,在模型評估階段,得出的模型準確率是91%,因此不是一個很好的演算法模型。下面我們將嘗試構建一個較複雜的多層卷積網路模型,將圖片預測模型準確率提高到 99.2%
1> 下載 數據集
2> 構建模型:
#!/usr/bin/python## 導入數據#import input_datamnist = input_data.read_data_sets("MNIST_data/", one_hot=True)## 定義 權重 和 偏置項#def weight_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial)def bias_variable(shape): initial = tf.constant(0.1, shape=shape) return tf.Variable(initial)## 定義 卷機 和 池化#def conv2d(x, W): return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding=SAME)def max_pool_2x2(x): return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=SAME)## 第一層卷積## 定義一個5*5的輸入,1個通道,32個特徵的卷積W_conv1 = weight_variable([5, 5, 1, 32])b_conv1 = bias_variable([32])# 定義28*28像素的圖片的轉化x_image = tf.reshape(x, [-1,28,28,1])h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)h_pool1 = max_pool_2x2(h_conv1)## 第二層卷積## 得到64個特徵W_conv2 = weight_variable([5, 5, 32, 64])b_conv2 = bias_variable([64])h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)h_pool2 = max_pool_2x2(h_conv2)## 密集連接層#W_fc1 = weight_variable([7 * 7 * 64, 1024])b_fc1 = bias_variable([1024])h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)## dropout#keep_prob = tf.placeholder("float")h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)## 添加一個 softmax 回歸層#W_fc2 = weight_variable([1024, 10])b_fc2 = bias_variable([10])y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)## 訓練模型#cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))sess.run(tf.initialize_all_variables())for i in range(20000): batch = mnist.train.next_batch(50) if i%100 == 0: train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0}) print "step %d, training accuracy %g"%(i, train_accuracy) train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})print "test accuracy %g"%accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})
參考鏈接:
TensorFlow 官方文檔中文版
TensorFlow實戰之:Quick Start
推薦閱讀:
※深度學習巨頭Yann Lecun 中科院自動化所座談及清華大學講座乾貨速遞(一)(內含珍貴歷史影像及學術八卦)
※驗證碼識別(1) -- 1 個字元,1 個 softmax 層,正確率 92%
※TensorFlow開源一周年:這可能是一份最完整的盤點
※配置深度學習主機與環境(TensorFlow+1080Ti) | 第一章:硬體選購與主機組裝
※[谷創字幕組] Google 開發技術周刊 097 期
TAG:人工智慧 | TensorFlow | TensorLayer深度學習庫 |