深度學習利器:TensorFlow使用實戰分享
深度學習及TensorFlow簡介
深度學習目前已經被應用到影象識別,語音識別,自然語言處理,機器翻譯等場景並取得了很好的行業應用效果。至今已有數種深度學習框架,如TensorFlow,Caffe、Theano、Torch、MXNet,能夠支援深度神經網路、卷積神經網路、深度信念網路和遞迴神經網路等模型。TensorFlow最初由Google Brain團隊的研究員和工程師研發,目前已成為GitHub上最受歡迎的機器學習專案。
TensorFlow開源一週年以來,已有500+contributors,以及11000+個commits。目前採用TensorFlow平臺,在生產環境下進行深度學習的公司有ARM、Google、UBER、DeepMind、京東等公司。目前谷歌已把TensorFlow應用到很多內部專案,如谷歌語音識別,GMail,谷歌圖片搜尋等。TensorFlow主要特性有:
使用靈活:TensorFlow是一個靈活的神經網路學習平臺,採用圖計算模型,支援High-Level的API,支援Python、C++、Go、Java介面。
跨平臺:TensorFlow支援CPU和GPU的運算,支援桌上型電腦、伺服器、移動平臺的計算。並從r0.12版本支援Windows平臺。
產品化:TensorFlow支援從研究團隊快速遷移學習模型到生產團隊。實現了研究團隊釋出模型,生產團隊驗證模型,構建起了模型研究到生產實踐的橋樑。
高效能:TensorFlow中採用了多執行緒,佇列技術以及分散式訓練模型,實現了在多CPU、多GPU的環境下分散式訓練模型。
本文主要介紹TensorFlow一些關鍵技術的使用實踐,包括TensorFlow變數、TensorFlow應用架構、TensorFlow視覺化技術、GPU使用、以及HDFS整合使用。
TensorFlow變數
TensorFlow中的變數在使用前需要被初始化,在模型訓練中或訓練完成後可以儲存或恢復這些變數值。下面介紹如何建立變數,初始化變數,儲存變數,恢復變數以及共享變數。
#建立模型的權重及偏置
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
#指定變數所在裝置為CPU:0
with tf.device("/cpu:0"):
v = tf.Variable (...)
#初始化模型變數
init_op = tf.global_variables_initializer()
sess=tf.Session()
sess.run(init_op)
#儲存模型變數,由三個檔案組成model.data,model.index,model.meta
saver = tf.train.Saver()
saver.restore(sess, "/tmp/model")
#恢復模型變數
saver.restore(sess, "/tmp/model")
在複雜的深度學習模型中,存在大量的模型變數,並且期望能夠一次性地初始化這些變數。TensorFlow提供了tf.variable_scope和tf.get_variable兩個API,實現了共享模型變數。tf.get_variable(, , ):表示建立或返回指定名稱的模型變數,其中name表示變數名稱,shape表示變數的維度資訊,initializer表示變數的初始化方法。tf.variable_scope():表示變數所在的名稱空間,其中scope_name表示名稱空間的名稱。共享模型變數使用示例如下:
#定義卷積神經網路運算規則,其中weights和biases為共享變數
def conv_relu(input, kernel_shape, bias_shape):
# 建立變數"weights".
weights = tf.get_variable("weights", kernel_shape, initializer=tf.random_normal_initializer())
# 建立變數 "biases".
biases = tf.get_variable("biases", bias_shape, initializer=tf.constant_initializer(0.0))
conv = tf.nn.conv2d(input, weights, strides=[1, 1, 1, 1], padding='SAME')
return tf.nn.relu(conv + biases)
#定義卷積層,conv1和conv2為變數名稱空間
with tf.variable_scope("conv1"):
# 建立變數 "conv1/weights", "conv1/biases".
relu1 = conv_relu(input_images, [5, 5, 32, 32], [32])
with tf.variable_scope("conv2"):
# 建立變數 "conv2/weights", "conv2/biases".
relu1 = conv_relu(relu1, [5, 5, 32, 32], [32])
TensorFlow應用架構
TensorFlow的應用架構主要包括模型構建,模型訓練,及模型評估三個方面。模型構建主要指構建深度學習神經網路,模型訓練主要指在TensorFlow會話中對訓練資料執行神經網路運算,模型評估主要指根據測試資料評估模型精確度。如下圖所示:
網路模型,損失方程,模型訓練操作定義示例如下:
#兩個隱藏層,一個logits輸出層
hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)
hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)
logits = tf.matmul(hidden2, weights) + biases
#損失方程,採用softmax交叉熵演算法
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits( logits, labels, name='xentropy')
loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
#選定優化演算法及定義訓練操作
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
global_step = tf.Variable(0, name='global_step', trainable=False)
train_op = optimizer.minimize(loss, global_step=global_step)
模型訓練及模型驗證示例如下:
#載入訓練資料,並執行網路訓練
for step in xrange(FLAGS.max_steps):
feed_dict = fill_feed_dict(data_sets.train, images_placeholder, labels_placeholder)
_, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)
#載入測試資料,計算模型精確度
for step in xrange(steps_per_epoch):
feed_dict = fill_feed_dict(data_set, images_placeholder, labels_placeholder)
true_count += sess.run(eval_correct, feed_dict=feed_dict)
TensorFlow視覺化技術
規模的深度神經網路運算模型是非常複雜的,並且不容易理解運算過程。為了易於理解、除錯及優化神經網路運算模型,資料科學家及應用開發人員可以使用TensorFlow視覺化元件:TensorBoard。TensorBoard主要支援TensorFlow模型視覺化展示及統計資訊的圖表展示。TensorBoard應用架構如下:
TensorFlow視覺化技術主要分為兩部分:TensorFlow摘要模型及TensorBoard視覺化元件。在摘要模型中,需要把模型變數或樣本資料轉換為TensorFlow summary操作,然後合併summary操作,最後通過Summary Writer操作寫入TensorFlow的事件日誌。TensorBoard通過讀取事件日誌,進行相關摘要資訊的視覺化展示,主要包括:Scalar圖、圖片資料視覺化、聲音資料展示、圖模型視覺化,以及變數資料的直方圖和概率分佈圖。TensorFlow視覺化技術的關鍵流程如下所示:
#定義變數及訓練資料的摘要操作
tf.summary.scalar('max', tf.reduce_max(var))
tf.summary.histogram('histogram', var)
tf.summary.image('input', image_shaped_input, 10)
#定義合併變數操作,一次性生成所有摘要資料
merged = tf.summary.merge_all()
#定義寫入摘要資料到事件日誌的操作
train_writer = tf.train.SummaryWriter(FLAGS.log_dir + '/train', sess.graph)
test_writer = tf.train.SummaryWriter(FLAGS.log_dir + '/test')
#執行訓練操作,並把摘要資訊寫入到事件日誌
summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
train_writer.add_summary(summary, i)
#從https://github.com/tensorflow/tensorflow/blob/r0.12/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py下載示例code,並執行模型訓練
python mnist_with_summaries.py
#啟動TensorBoard,TensorBoard的UI地址為http://ip_address:6006
tensorboard --logdir=/path/to/log-directory
TensorBoard Scalar圖如下所示,其中橫座標表示模型訓練的迭代次數,縱座標表示該標量值,例如模型精確度,熵值等。TensorBoard支援這些統計值的下載。
TensorFlow Image摘要資訊如下圖所示,該示例中顯示了測試資料和訓練資料中的手寫數字圖片。
TensorFlow圖模型如下圖所示,可清晰地展示模型的訓練流程,其中的每個方框表示變數所在的名稱空間。包含的名稱空間有input(輸入資料),input_reshape(矩陣變換,用於圖形化手寫數字), layer1(隱含層1), layer2(隱含層2), dropout(丟棄一些神經元,防止過擬合), accuracy(模型精確度), cross_entropy(目標函式值,交叉熵), train(訓練模型)。例如,input名稱空間操作後的tensor資料會傳遞給input_reshape,train,accuracy,layer1,cross_entropy名稱空間中的操作。
TensorFlow變數的概率分佈如下圖所示,其中橫座標為迭代次數,縱座標為變數取值範圍。圖表中的線表示概率百分比,從高到底為[maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]。例如,圖表中從高到底的第二條線為93%,對應該迭代下有93%的變數權重值小於該線對應的目標值。
上述TensorFlow變數概率分佈對應的直方圖如下圖所示:
TensorFlow GPU使用
GPU裝置已經廣泛地應用於影象分類,語音識別,自然語言處理,機器翻譯等深度學習領域,並實現了開創性的效能改進。與單純使用CPU相比,GPU 具有數以千計的計算核心、可實現 10-100 倍的效能提升。TensorFlow支援GPU運算的版本為tensorflow-gpu,並且需要先安裝相關軟體:GPU運算平臺CUDA和用於深度神經網路運算的GPU加速庫CuDNN。在TensorFlow中,CPU或GPU的表示方式如下所示:
“/cpu:0”:表示機器中第一個CPU。
“/gpu:0”:表示機器中第一個GPU卡。
“/gpu:1”:表示機器中第二個GPU卡。
TensorFlow中所有操作都有CPU和GPU運算的實現,預設情況下GPU運算的優先順序比CPU高。如果TensorFlow操作沒有指定在哪個裝置上進行運算,預設會優選採用GPU進行運算。下面介紹如何在TensorFlow使用GPU:
# 定義使用gpu0執行a*b的矩陣運算,其中a,b,c都在gpu0上執行
with tf.device('/gpu:0'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# 通過log_device_placement指定在日誌中輸出變數和操作所在的裝置
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
print sess.run(c)
本實驗環境下只有一個GPU卡,裝置的Device Mapping及變數操作所在裝置位置如下:
#裝置的Device Mapping
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: Tesla K20c, pci bus id: 0000:81:00.0
#變數操作所在裝置位置
a: (Const): /job:localhost/replica:0/task:0/gpu:0
b: (Const): /job:localhost/replica:0/task:0/gpu:0
(MatMul)/job:localhost/replica:0/task:0/gpu:0
預設配置下,TensorFlow Session會佔用GPU卡上所有記憶體。但TesnorFlow提供了兩個GPU記憶體優化配置選項。 config.gpu_options.allow_growth:根據程式執行情況,分配GPU記憶體。程式開始的時候分配比較少的記憶體,隨著程式的執行,增加記憶體的分配,但下不會釋放已經分配的記憶體。config.gpu_options.per_process_gpu_memory_fraction:表示按照百分比分配GPU記憶體,例如0.4表示分配40%的GPU記憶體。示例程式碼如下:
#定義TensorFlow配置
config = tf.ConfigProto()
#配置GPU記憶體分配方式
#config.gpu_options.allow_growth = True
#config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config, ...)
TensorFlow與HDFS整合使用
HDFS是一個高度容錯性的分散式系統,能提供高吞吐量的資料訪問,非常適合大規模資料集上的應用。TensorFlow與HDFS整合示例如下:
#配置JAVA和HADOOP環境變數
source $HADOOP_HOME/libexec/hadoop-config.sh
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/amd64/server
#執行TensorFlow執行模型
CLASSPATH=$($HADOOP_HDFS_HOME/bin/hadoop classpath --glob) python tensorflow_model.py
#在TensorFlow模型中定義檔案的讀取佇列
filename_queue = tf.train.string_input_producer(["hdfs://namenode:8020/path/to/file1.csv", "hdfs://namenode:8020/path/to/file2.csv"])
#從檔案中讀取一行資料,value為所對應的行資料
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
# 把讀取到的value值解碼成特徵向量,record_defaults定義解碼格式及對應的資料型別
record_defaults = [[1], [1], [1], [1], [1]]
col1, col2, col3, col4, col5 = tf.decode_csv(value, record_defaults=record_defaults)
features = tf.pack([col1, col2, col3, col4])
with tf.Session() as sess:
# 定義同步物件,並啟動相應執行緒把HDFS檔名插入到佇列
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
for i in range(1200):
# 從檔案佇列中讀取一行資料
example, label = sess.run([features, col5])
#請求停止佇列的相關執行緒(包括進隊及出隊執行緒)
coord.request_stop()
#等待佇列中相關執行緒結束(包括進隊及出隊執行緒)
coord.join(threads)
作者簡介: 武維([email protected]), 博士,現為IBM Spectrum Computing 研發工程師。主要從事大資料,深度學習,雲端計算等領域的研發工作。
相關推薦
深度學習利器:TensorFlow使用實戰分享
深度學習及TensorFlow簡介 深度學習目前已經被應用到影象識別,語音識別,自然語言處理,機器翻譯等場景並取得了很好的行業應用效果。至今已有數種深度學習框架,如TensorFlow,Caffe、Theano、Torch、MXNet,能夠支援深度神經網路、卷
深度學習利器: TensorFlow系統架構及高效能程式設計
2015年11月9日谷歌開源了人工智慧平臺TensorFlow,同時成為2015年最受關注的開源專案之一。經歷了從v0.1到v0.12的12個版本迭代後,谷歌於2017年2月15日釋出了TensorFlow 1.0 版本,並同時在美國加州山景城舉辦了首屆TensorFlo
實戰 Google 深度學習框架:TensorFlow 計算加速
# -*- coding: utf-8 -*- from datetime import datetime import os import time import tensorflow as tf import mnist_inference # 定義訓練神經網路時需要用到的配置。這些配置與5.5節中
深度學習筆記:tensorflow 入門 變數初始化
# 變數op # 1、變數能夠持久化儲存,普通的張量op是不行的 # 2、當定義一個變數op的時候,一定要在會話當中去執行初始化 a = tf.constant([1, 2, 3, 4, 5]) var = tf.Variable(tf.random_no
深度學習平臺:Tensorflow 環境搭建 | linux作業系統
1. SSH登入遠端伺服器 ssh 使用者名稱@IP地址 2. Annoconda安裝 下載地址 bash Anaconda-2.1.0-Linux-x86_64.sh 安裝完成之後要重啟終端,anaconda才能生效 刪除anac
分享《深度學習入門:基於Python的理論與實現 》中文版PDF和原始碼
下載:(https://pan.baidu.com/s/1agBctMG7HF45VwhYpQHDSQ) 《深度學習入門:基於Python的理論與實現》高清中文版PDF+原始碼 高清中文版PDF,314頁,帶目錄標籤,可複製貼上,高清晰。配套原始碼。 深度學習真正意義上的入門書,深入淺出地剖析了深度學習
分享《深度學習、優化與識別》PDF+《深度學習原理與TensorFlow實踐》PDF
.com log follow image http 51cto 分享 mage orf 下載:https://pan.baidu.com/s/1UNf3PmOtXCBCxx1eUprSzw 更多資料分享:http://blog.51cto.com/3215120 《深度學
機器學習筆記(十一): TensorFlow實戰三(MNIST數字識別問題)
1 - MNIST數字識別問題 前面介紹了這樣用TensorFlow訓練一個神經網路模型和主要考慮的問題及解決這些問題的常用方法。下面我們用一個實際的問題來驗證之前的解決方法。 我們使用的是MNIST手寫數字識別資料集。在很多深度學習教程中,這個資料集都會被當做一個案例。 1.1
機器學習筆記(十):TensorFlow實戰二(深層神經網路)
1 - 深度學習與深層神經網路 深度學習的精確定義為:“一類通過多層非線性變換對高複雜性資料建模演算法的集合” 因此,多層神經網路有著2個非常重要的特性 多層 非線性 1.1 - 線性模型的侷限性 線上性模型中,模型的輸出為輸入的加權和,假設一
機器學習筆記(九):Tensorflow 實戰一 (Tensorflow入門)
1 - TsensorFlow計算模型 ——計算圖 1.1- 計算圖的概念 計算圖是TensorFlow中最基本的一個概念,TensorFlow中的所有計算都會被轉化為計算圖上的節點。 在TensorFlow中,張量可以簡單地理解為多為陣列。如果說TensorFlow的第一個詞T
機器學習筆記(十五):TensorFlow實戰七(經典卷積神經網路:VGG)
1 - 引言 之前我們介紹了LeNet-5和AlexNet,在AlexNet發明之後,卷積神經網路的層數開始越來越複雜,VGG-16就是一個相對前面2個經典卷積神經網路模型層數明顯更多了。 VGGNet是牛津大學計算機視覺組(Visual Geometry Group)和Google
機器學習筆記(十四):TensorFlow實戰六(經典卷積神經網路:AlexNet )
1 - 引言 2012年,Imagenet比賽冠軍的model——Alexnet [2](以第一作者alex命名)。這個網路算是一個具有突破性意義的模型 首先它證明了CNN在複雜模型下的有效性,然後GPU實現使得訓練在可接受的時間範圍內得到結果,讓之後的網路模型構建變得更加複雜,並且通過
機器學習筆記(十三):TensorFlow實戰五(經典卷積神經網路: LeNet -5 )
1 - 引言 之前我們介紹了一下卷積神經網路的基本結構——卷積層和池化層。通過這兩個結構我們可以任意的構建各種各樣的卷積神經網路模型,不同結構的網路模型也有不同的效果。但是怎樣的神經網路模型具有比較好的效果呢? 下圖展示了CNN的發展歷程。 經過人們不斷的嘗試,誕生了許多有
機器學習筆記(十二):TensorFlow實戰四(影象識別與卷積神經網路)
1 - 卷積神經網路常用結構 1.1 - 卷積層 我們先來介紹卷積層的結構以及其前向傳播的演算法。 一個卷積層模組,包含以下幾個子模組: 使用0擴充邊界(padding) 卷積視窗過濾器(filter) 前向卷積 反向卷積(可選) 1.1
分享《深度學習、優化與識別》PDF+《深度學習原理與TensorFlow實踐》PDF+焦李成
water http mage 深度 51cto proc orf ESS pwc 下載:https://pan.baidu.com/s/1xj7GymClcExjn48rPwCowQ 更多資料分享:http://blog.51cto.com/14087171 《深度學習、
分享《深度學習入門:基於Python的理論與實現》+PDF+源碼+齋藤康毅+陸宇傑
過程 經典的 text proc log 使用 網絡 其中 itil 下載:https://pan.baidu.com/s/1FYcvG1tB__ooitilMpJC7w 更多資料分享:http://blog.51cto.com/14087171 《深度學習入門:基於Pyt
機器學習筆記(二十一):TensorFlow實戰十三(遷移學習)
1 - 引言 越複雜的神經網路,需要的訓練集越大,ImageNet影象分類資料集有120萬標註圖片,所以才能將152層的ResNet的模型訓練到大約96.%的正確率。但是在真正的應用中,很難收集到如此多的標註資料。即使收集到也需要花費大量人力物力來標註。並且即使有了大量的資料集,要訓練一
機器學習筆記(二十):TensorFlow實戰十二(TensorBoard視覺化)
1 - 引言 前面已經介紹到TensorFlow可以實現許多非常常用的神經網路結構,有的網路結構十分複雜,裡面的引數關係更是難以管理。因此,TensorFlow提供了一個視覺化工具TensorBoard。可以有效的展示執行過程中的計算圖、各種指標隨著時間的變化趨勢以及訓練中使用到的影象等
機器學習筆記(十九):TensorFlow實戰十一(多執行緒輸入資料)
1 - 引言 為了加速模型訓練的時間,TensorFlow提供了一套多執行緒處理輸入資料的框架。 下面我們來詳細的介紹如何使用多執行緒來加速我們的模型訓練速度 2 - 佇列與多執行緒 在TensorFlow中,佇列和變數類似,我們可以修改它們的狀態。下面給出一個示例來展示如
機器學習筆記(十八):TensorFlow實戰十(影象資料處理)
1 - 引言 之前我們介紹了通過卷積神經網路可以給影象識別技術帶來突破性的進展,現在我們從影象的預處理這個角度來繼續提升我們影象識別的準確率。 輸入的預處理需要使用TFRecord格式來同一不同的原始資料格式,並且更加有效的管理不同的屬性。 並且TensorFlow支援影象處理函式,