1. 程式人生 > >Tensorflow學習筆記(一):基礎知識

Tensorflow學習筆記(一):基礎知識

博主準備開始學習Tensorflow,將自己學到的東西總結出來,既能夠加深記憶,並且便於複習,如果能夠幫助到別人那更是再好不過了。

隨著深度學習的快速發展,深度學習工具也有很多。主流的深度學習框架包括Tensorflow,Caffe,Theano,Torch等等,但是因為Tensorflow的內部特性以及谷歌的支援,使得將來的趨勢以及資源都會向Tensorflow轉,因此Tensorflow是未來深度學習框架的趨勢。

本文將介紹Tensorflow的主要依賴包,計算模型,資料模型和會話模型幾個Tensorflow基礎知識點。

一、Tensorflow的主要依賴包

Tensorflow有很多依賴包,但是最主要的兩個工具包分別是Protocol Buffer和Bazel。

1. Protocol Buffer

Protocol Buffer是谷歌開發的處理結構化資料的工具。那麼什麼是處理結構化資料呢?其實結構化資料就是具備多種屬性的資料,比如一個使用者資訊可以包括名字、ID、E-mail地址等不同屬性,那麼它就是一個結構化資料。當需要對這些資料進行傳輸時,就要將它們序列化。序列化就是能夠把結構化的資料變為資料流的格式,即字串,如何將結構化的資料序列化,並能夠從序列化的資料中還原為結構化資料,統稱為結構化資料,這就是Protocol Buffer解決的主要問題。

XML和JSON是兩種比較常用的結構化資料處理工具,比如XML資料的格式為:

<user
>
<name>張三</name> <id>12345</id> <email>[email protected]</email>

同樣的資料,JSON的格式為:

{
    “name": "張三",
    "id": "12345",
    "email": "[email protected]",
}

Protocol Buffer格式的資料和XML或者JSON格式的資料有比較大的區別。首先,Protocol Buffer序列化之後得到的資料不是可讀的字串,而是二進位制流。其次,XML或JSON格式的資料資訊都包含在序列化之後的資料中,不需要任何其他資訊就能還原序列化之後的資料。但使用Protocol Buffer時需要先定義資料的格式,還原一個序列化之後的資料需要使用這個定義好的資料格式。因此,Protocol Buffer序列化出來的資料要比XML格式小3到10倍,解析時間快20到100倍。

message user{
    optional string name = 1;
    required int32 id = 2;
    repeated string email = 3;
}

Protocol Buffer定義資料格式的檔案儲存在.proto檔案中。每一個message代表了一類結構化資料,這裡面有三種屬性,必須的,可選的,可重複的。若一個屬性是必須的,那麼所有這個message的例項都需要有這個屬性;若是可選的,則這個屬性可以取值為空;若是可重複的,則這個屬性的取值可以是一個列表。

2. Bazel

Bazel是谷歌開源的自動化構建工具,谷歌內部絕大部分應用都是通過它來編譯的。

專案空間是Bazel的一個基本概念。一個專案空間可以簡單理解為一個資料夾,這個資料夾中包含了編譯一個軟體所需要的原始碼以及輸出編譯結果的軟連線地址。一個專案空間內可以只包含一個應用,也可以包含多個應用。一個專案空間所對應的資料夾是這個專案的根目錄,在這個根目錄中需要有一個WORKSPACE檔案,此檔案定義了對外部資源的依賴關係。空檔案也是一個合法的WORKSPACE檔案。

二、TensorFlow計算模型——計算圖

1. 計算圖的概念

Tensor和Flow是TensorFlow最重要的兩個概念。其中Tensor表示張量,即資料模型,將在後面介紹。而Flow表示流,直觀表達了張量之間通過計算相互轉化的過程,是TensorFlow的計算模型。

計算圖中每一個節點都是一個運算,每一條邊代表計算之間的依賴關係。Tensorflow的計算一般分為兩個階段,第一階段定義計算圖中所有的計算,第二階段為執行計算。以下程式碼給出了計算定義階段樣例:

import tensorflow as tf
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
res = a + b 

程式會自動維護一個預設的計算圖,通過tf.get_default_graph()函式可以獲取當前預設的計算圖。

print(a.graph is tf.get_default_graph()) # 輸出為True

除了預設的計算圖,Tensorflow支援通過tf.Graph函式來生成新的計算圖。不同計算圖上的張量和運算都不會共享。計算圖不僅可以隔離張量和計算,還提供了管理張量和計算的機制,計算圖可以通過tf.Graph.device函式來指定執行計算的裝置。

三、TensorFlow的資料模型——張量

1. 張量的概念
張量可以被簡單理解為多維陣列,其中零階張量表示標量,也就是一個數;一階張量表示為一個一維陣列;第n階張量表示為n維陣列。

張量在TensorFlow中的實現不是直接採用陣列的形式,它只是對TensorFlow中運算結果的引用。張量中並沒有真正儲存數字,它儲存的是如何得到這些數字的計算過程。例如:

import tensorflow as tf
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
res = tf.add(a, b, name="add")
print res

'''
輸出:Tensor("add:0", shape=(2,),dtype=float32)
'''

TensorFlow中的張量和Numpy中的陣列不同,TensorFlow的計算結果不是一個具體的數字,而是一個張量的結構。一個張量儲存了三個屬性:名字、維度和型別。

2. 張量的使用

張量的使用可以分為兩大類。

第一類是對中間計算結果的引用,這樣可以提高程式碼的可讀性。

# 使用張量記錄中間結果
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
res = a + b

# 直接計算向量的和,可讀性較差
res = tf.constant([1.0, 2.0], name="a") + tf.constant([2.0, 3.0], name="b")

第二類是當計算圖構造完成後,張量可以用來獲得計算結果,得到真實的數字。下面介紹的會話就可以得到這些具體的數字。

四、 TensorFlow執行模式——會話

前面介紹了TensorFlow如何組織資料和運算的,本節將介紹如何使用TensorFlow中的會話來執行定義好的運算。

會話模式有兩種,第一種需要明確呼叫會話生成函式和關閉會話函式。

sess = tf.Session() # 建立一個會話
sess.run(...) 
sess.close() # 關閉會話使得本次執行中使用到的資源可以被釋放

使用這種模式,需要明確呼叫Session.close函式關閉會話並釋放資源。但當程式因為異常而退出時,關閉會話的函式可能就不會被執行從而導致資源洩漏。為了解決異常退出時資源釋放的問題,有一種新的執行模式——上下文管理器來使用會話。

# 建立會話,並通過Python中的上下文管理器來管理這個會話
with tf.Session() as sess:
    sess.run(...)
# 不需要呼叫函式關閉會話

這種方式既解決了因為異常退出時資源釋放問題,又解決了忘記呼叫Session.close函式而產生的資源洩漏。

TensorFlow也可以通過設定預設會話計算張量的取值

sess = tf.Session()
with sess.as_default():
    print(res.eval())

相關推薦

Tensorflow學習筆記基礎知識

博主準備開始學習Tensorflow,將自己學到的東西總結出來,既能夠加深記憶,並且便於複習,如果能夠幫助到別人那更是再好不過了。 隨著深度學習的快速發展,深度學習工具也有很多。主流的深度學習框架包括Tensorflow,Caffe,Theano,Torch等

HLSL學習筆記基礎

pad ddx 做了 cto har 分割 with 圖形 content http://www.cnblogs.com/rainstorm/archive/2013/05/04/3057444.html 前言 五一在家無事,於是學習了一下HLSL,基於XAN4.0的。學習

Spring AOP學習筆記基礎概念

AOP產生背景 AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。不

tensorflow學習筆記命令列引數

全域性環境下編寫程式碼 import tensorflow as tf flags = tf.flags #flags是一個檔案:flags.py,用於處理命令列引數的解析工作 logging =

Python 學習筆記基礎與入門

注:因為先前學習過C/C#,Java。故學習Python時只會記錄與此前幾種語言不同之處 Python是一種解釋型、面向物件、動態資料型別的高階程式設計語言。 Python簡介 Python 是一個高層次的結合瞭解釋性、編譯性、互動性和麵向物件

Scala學習筆記基礎

1、進入scala:直接輸入scala即可 2、退出:輸入:quit或者:q都可以 3、輸入變數一部分,按Tab鍵可補全可呼叫的方法名稱 4、從技術上講Scala並不是一個直譯器,實際上是將讀取的輸入內容迅速的編譯成位元組碼,然後交由Java虛擬機器執行,也被稱為REP

TensorFlow學習筆記TF基本操作

一.TensorFlow基本執行流程如下: 使用圖 (graph) 來表示計算任務. 在被稱之為 會話 (Session) 的上下文 (context) 中執行圖. 使用 tensor 表示資料. 通過 變數 (Variable) 維護狀態. 使用 f

Python學習筆記基礎語法、變數型別、運算子快速入門篇

Head First Python、Python基礎教程 下劃線的特殊意義 以下劃線開頭的識別符號是有特殊意義的。 以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用”from xxx import *”而匯入

JS筆記基礎知識

bsp man function child 變量 file 使用 IE 單獨 (一) 標識符 標識符就是一個名字,在JS中,標識符用來對變量和函數命名,或者用做JS代碼中某些循環語句中的跳轉位置的標記。JS的標識符必須以字母、_或$符號開始,後續字符可以是字母、數字、_

朱老師ARM裸機學習筆記計算機基礎知識

RISC和CISC的區別 CISC(complex instruction-set computer)複雜指令集 特點: 指令較多,較豐富,CISC的CPU 較難設計,Intel是典型的CISC體系CPU。 RISC(reduce instruction

雲端計算學習筆記雲端計算基礎

本系列將對雲端計算進行學習,目前資料來自《雲端計算-概念、技術與架構》(第一作者:Tomas Erl)一書。目的是將書讀薄。這本書看了第一部分,翻譯怎麼說呢,偶碰網路上的詞不準確(極個別,不影響),可能是老師找學生翻譯的。語言有些生硬,譯者可能忠實原文,一對一進行了直譯,所有讀起來覺得不是中國人在說話,有

EF6 學習筆記Code First 方式生成數據庫及初始化數據庫實際操作

view sqlserver 4.5 xpl 安裝 右鍵 ef6 字符串 ref 參考原文地址: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-wit

tensorflow筆記基礎知識

輸入 gpu oat baidu nump 通過 img ubuntu下 能力 tensorflow筆記(一)之基礎知識 版權聲明:本文為博主原創文章,轉載請指明轉載地址 http://www.cnblogs.com/fydeblog/p/7399701.html 前言

Servlet學習筆記生命周期

磁盤 停止 生命 第一個 每一個 clas 瀏覽器 doget des 一、Servlet 生命周期:   Servlet 生命周期可被定義為從創建直到毀滅的整個過程。以下是 Servlet 遵循的過程:初始化——響應請求——終止——回收 Servlet 通過調用 in

JSP學習筆記JSP語法和指令

沒有 文件的 encoding 引入 2.0 .cn name blog .get 一、語法 1、腳本程序的語法格式:   腳本程序可以包含任意量的Java語句、變量、方法或表達式,只要它們在腳本語言中是有效的。 <% 代碼片段 %> 2、中文編碼問題   

C#可擴展編程之MEF學習筆記MEF簡介及簡單的Demo

com ring this exec hosting code .cn 引用 展開 在文章開始之前,首先簡單介紹一下什麽是MEF,MEF,全稱Managed Extensibility Framework(托管可擴展框架)。單從名字我們不難發現:MEF是專門致力於解決擴展性

《機器學習學習筆記線性回歸、邏輯回歸

ros XA andrew ID learn 給定 編程練習 size func 《機器學習》學習筆記(一):線性回歸、邏輯回歸 本筆記主要記錄學習《機器學習》的總結體會。如有理解不到位的地方,歡迎大家指出,我會努力改正。 在學習《機器學習》時,我主要是

算法學習筆記插入排序和線性查找

插入排序 算法學習 AS 獲取 ear array import 右移 創建 (一)插入排序 看下面這張圖片:把打牌時手上的牌抽象為一個列表A,j表示當前最新抓的牌的索引(先放到手上最右邊) 索引 j =0 時 A[j] = 3 j >= 1時, 1、我們拿到

Guava學習筆記基礎Joiner,Objects,Splitter及Strings

nonnull obj expect null dto 字符 情況 core cte 添加Maven依賴 JoinerTest import com.google.common.base.Joiner; import org.junit.Assert; import org

Tensorflow 學習筆記mac os 安裝 tensorflow

trap ras str ons bre col hello 指定 any Homebrew 安裝python brew install python 安裝pip curl ‘https://bootstrap.pypa.io/get-pip.py’ > get