從零開始學TensorFlow【什麼是TensorFlow?】

2021-02-13 Java3y
前言

只有光頭才能變強。

文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y

TensorFlow是什麼意思?Tensor?Flow?這篇文章介紹TensorFlow一些最基礎的知識。

一、Tensor介紹

在介紹之前,首先要記住一個結論:TensorFlow使用Tensor來表示數據

接著我們來看看什麼是Tensor,在官網的文檔中,Tensor被翻譯成」張量「。其中也給出了一個定義:

張量是對矢量和矩陣向潛在的更高維度的泛化,TensorFlow 在內部將張量表示為基本數據類型的n維數組

不知道你們看完這句話有啥感受,反正我當時就看不懂,啥是」張量「?。於是,我就跑去知乎裡邊用關鍵字搜了一下:」張量是什麼「。果真給我搜到了相關的問題:《怎麼通俗地理解張量?》

我本以為通過知乎,就可以通俗易懂地理解什麼是張量,能給我一個清晰的認識。殊不知,大多數答主都在回答在物理和數學中張量的定義,隨後貼出了一堆我看不懂的公式。其中,也看到了一種相對通俗易懂的定義:

一個量, 在不同的參考系下按照某種特定的法則進行變換, 就是張量.

把所有答主的回答都閱讀了一遍,看完就更加抽象了。再回到官方文檔中,看看官方介紹張量的例子,貌似有點懂了。

目前為止我們有兩個結論:

我再翻譯一下上面的兩句話:在TensorFlow所有的數據都是一個n維的數組,只是我們給它起了個名字叫做張量(Tensor)

中間折騰了一大堆,實際上還是將最開頭的結論和官方的定義再翻譯成自己覺得好理解的話…但很多時候,學習就這麼一個過程。

1.1Tensor的基礎

從上面我們已經得知,Tensor(張量)實際上就是一個n維的數組。這就延伸了幾個的術語:

1.1.1階(秩)

其實上,階就是平時我們所說的維數

比如我們有一個二維的數組,那麼這個階就是2

比如我們有一個三維的數組,那麼這個階就是3

以前在寫Java的時候,可能一般接觸到的都是二維的,但在機器學習上就很可能有很高的維度,那維數我們怎麼數?很簡單,我們數括號就行了。舉個例子,我們可能會看到有下面的一個數組輸出形式:

[[[9 6]
  [6 9]
  [8 8]
  [7 9]]
 [[6 1]
  [3 5]
  [1 7]
  [9 4]]]

我們直接看第一個括號到第一個數字,有多少個括號就知道了。[[[9可以發現有3個括號,那這個就是一個三維的數組,它的階(秩)就是3

1.1.2形狀

張量的形狀可以讓我們看到每個維度中元素的數量

比如我們在Java中創建出一個二維的數組:int [][] array = new int[3][4],我們就可以知道這個數組有三行有四列。但如果我們創建出一個多維的數組,單單只用行和列就描述不清了。所以,在TensorFlow一般我們會這樣描述:

如果我們要列印上面數組的形狀時,我們可以得到這樣的結果:shape = (3,4)。我們再看看第一篇寫」機器學習HelloWorld「的時候,再來看看當時列印的結果:shape = (60000, 28, 28)。通過shape我們就可以得到一些信息

當前數組是三維的

在第一維中有60000個元素

在第二維中有28個元素

在第三維中有28個元素

那我們如果拿到一個數組,怎麼通過肉眼看他的shape呢?

比如說:m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],這個很簡單,一眼就可以看出這個是一個二維數組(矩陣),有三行三列。所以shape的結果應該是(3,3)

再來看一個:t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]],從多個括號上我們可以看出,這是三維的。我們先把最外層括號去掉得到的結果是[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]

Ok,到這一步,我們可以理解成有個子數組,於是我們的shape可以先寫成shape(3,?,?)

隨後,我們繼續把外層的括號去除,得到這樣的結果:[2], [4], [6],也是有三個元素,於是我們的shape就可以填成shape(3,3,?)

最後,再把括號去掉,我們可以發現只有一個元素,於是最後的結果就是shape(3,3,1)

我們可以看下圖來鞏固一下上面所說的概念:

例子1.1.3 Tensor數據類型

TensorFlow 在內部將張量表示為基本數據類型的 n維數組,沒錯的。在一個數組裡邊,我們總得知道我們的存進去的數據究竟是什麼類型

Tensor的數據類型如下所示:

Tenor的數據類型二、特殊的張量

特殊的張量由一下幾種:

tf.Variable— 變量

tf.constant— 常量

tf.placeholder—佔位符

tf.SparseTensor—稀疏張量

這次,我們先來講講前三種(比較好理解),分別是變量、常量和佔位符。

2.1 常量

常量就是常量的意思,一經創建就不會被改變。(相信大家還是能夠理解的)

在TensorFlow中,創建常量的方式十分簡單:

a = tf.constant(2)
b = tf.constant(3)

2.2變量

變量也挺好理解的(就將程式語言的概念跟這裡類比就好了)。一般來說,我們在訓練過程中的參數一般用變量進行存儲起來,因為我們的參數會不停的變化。

在TensorFlow創建變量有兩種方式:



W = tf.Variable(initial_value=tf.random_normal(shape=(1, 4), mean=100, stddev=0.35), name="W")
b = tf.Variable(tf.zeros([4]), name="b")


my_int_variable = tf.get_variable("my_int_variable", [1, 2, 3], dtype=tf.int32,
  initializer=tf.zeros_initializer)

值得注意的是:當我們創建完變量以後,我們每次使用之前,都需要為其進行初始化!

tf.global_variables_initializer()

2.3佔位符

我最早接觸佔位符這個概念的時候是在JDBC的時候。因為SQL需要傳入的參數才能確定下來,所以我們可能會寫出這樣的SQL語句:select * from user where id =?

同樣地,在TensorFlow佔位符也是這麼一個概念,可能需要等到運行的時候才把某些變量確定下來,於是我們就有了佔位符。

在TensorFlow使用佔位符也很簡單:


train_filenames = tf.placeholder(tf.string, shape=[None])



feed_dict={train_filenames: training_filenames}

上面的東西說白了在程式語言中都是有的,只是語法變了而已

三、Flow?介紹圖和節點

我們將Flow翻譯成中文:,所以現在是Tensor流

其實,在TensorFlow中,使用圖 (graph) 來表示計算任務。其實TensorFlow默認會給我們一張空白的,一般我們會叫這個為」數據流圖「。數據流圖由有向邊和節點組成,在使用TensorFlow的時候我們會在圖中創建各種的節點,而Tensor會在這些節點中流通。所以,就叫做TensorFlow

那有人就會好奇,我們執行什麼操作會創建節點呢?在TensorFlow中,節點的類型可以分為三種:

看到這裡的同學,可能就反應過來了:原來在上面創建的變量、常量和佔位符在TensorFlow中都會生成一個節點!對於這類的操作Operation(行為)一般大家會簡說成op

所以,op就是在TensorFlow中所執行的一個操作統稱而已(有可能是創建變量的操作、也有可能是計算的操作)。在TensorFlow的常見的op有以下:

Tensorflow常見的op

其實說白了就是TensorFlow會給我們一張空白的數據流圖,我們往這張數據流圖填充(創建節點),從而實現想要效果。

開局一張圖,內容全靠編!

數據流圖的組成

我們來看看官方的給出數據流圖的gif,加深下印象。

數據流圖四、啥是session?

TensorFlow程序通常被組織成一個構建階段和執行階段. 在構建階段, op的執行步驟被描述成一個圖. 在執行階段, 使用會話執行執行圖中的op。

說白了,就是當我們在編寫代碼的時候,實際上就是在將TensorFlow給我們的空白圖描述成一張我們想要的圖。但我們想要運行出圖的結果,那就必須通過session來執行。

舉個小例子:

import tensorflow as tf

x = tf.placeholder(tf.float32)
W = tf.Variable(1.0)
b = tf.Variable(1.0)
y = W * x + b


with tf.Session() as sess:
    tf.global_variables_initializer().run() 
    fetch = y.eval(feed_dict={x: 3.0})      
    print(fetch)   

4.1 Fetch是啥?

Fetch就時候可以在session.run的時候傳入多個op(tensor),然後返回多個tensor(如果只傳入一個tensor的話,那就是返回一個tensor)

4.2tensor.eval()和Operation.run()

有的同學在查閱資料的時候,發現可能調用的不是session.run,而是tensor.eval()和Operation.run()。其實,他們最後的調用的還是session.run。不同的是session.run可以一次返回多個tensor(通過Fetch)。

最後實際還是掉session.run最後

曾經看到一段話總結得不錯:

使用 tensor 表示數據.

使用圖 (graph) 來表示計算任務.

在會話(session)中運行圖

通過 變量 (Variable) 維護狀態.

TensorFlow 是一個編程系統, 使用圖來表示計算任務. 圖中的節點被稱之為 op (operation 的縮寫). 一個 op 獲得 0 個或多個 Tensor, 執行計算, 產生 0 個或多個 Tensor. 每個 Tensor 是一個類型化的多維數組.

這篇文章簡單講了TensorFlow是啥意思以及一些基礎的概念。但我也只是簡單以我的理解方式來說了一些常見概念。裡頭的知識點還是比較多的(比如創建變量的時候一般我們會指定哪些參數….),這些就交由大家去官網、博客、書籍去學習了。

我相信,只要了解了這些概念,那學習一定可以事半功倍!

下一篇TensorFlow文章敬請期待~

參考資料:

樂於輸出乾貨的Java技術公眾號:Java3y。公眾號內有200多篇原創技術文章、海量視頻資源、精美腦圖,不妨來關注一下!

帥的人都關注了有幫助?好看!轉發!

相關焦點

  • TensorFlow極速入門
    那麼本篇教程會講到什麼?首先是一些基礎概念,包括計算圖,graph 與 session,基礎數據結構,Variable,placeholder 與 feed_dict 以及使用它們時需要注意的點。最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、tensorflow是什麼?te
  • tensorflow極速入門
    一、前言目前,深度學習已經廣泛應用於各個領域,比如圖像識別,圖形定位與檢測,語音識別,機器翻譯等等,對於這個神奇的領域,很多童鞋想要一探究竟,這裡拋磚引玉的簡單介紹下最火的深度學習開源框架 tensorflow。本教程不是 cookbook,所以不會將所有的東西都事無巨細的講到,所有的示例都將使用 python。那麼本篇教程會講到什麼?
  • TensorFlow應用實戰 | TensorFlow基礎知識
    定義算法的計算圖(Graph)結構把實驗的器材等組裝好使用會話(Session)執行圖的一部分(計算)開始點燃酒精燈等操作Graph tf.Graphhttps://www.tensorflow.org/api_docs/python/tf/Graph如果你沒有顯式的去創建圖,它其實已經幫你註冊了一個默認的圖
  • tensorflow安裝教程
    tensorflow是谷歌開源的人工智慧庫,有最完善的生態支持。是進行人工智慧領域開發和科研的必備工具。本文在windows10下,藉助anacondaAnaconda安裝和使用,AkShare入門,安裝tensorflow2.0。
  • 令人困惑的TensorFlow!
    如果你仔細閱讀,你甚至可能已經發現了這個頁面(https://www.tensorflow.org/programmers_guide/graphs),該頁面涵蓋了我將以更準確和技術化的方式去解釋的內容。本節是一篇高級攻略,把握重要的直覺概念,同時忽略一些技術細節。那麼:什麼是計算圖?它本質上是一個全局數據結構:是一個有向圖,用於捕獲有關如何計算的指令。
  • Anaconda軟體安裝TensorFlow教程
    Anaconda軟體的安裝,請閱讀文章《Anaconda軟體安裝和簡易使用教程》第一步:創建r-tensorflow環境打開Anaconda Prompt,執行命令conda create --name r-tensorflow python=3.6該命令用來創建r-tensorflow虛擬環境
  • Windows上安裝Tensorflow踩的坑
    前言    看到Rstudio中開始支持Tensorflow,本人是欣喜若狂的,同時TensorFlow官網從16年9月低開始支持windows
  • 運行tensorflow2.0出錯
    今天在調試tf2.0的代碼的時候,Console丟了一個錯誤出來:AttributeError: module 'tensorflow'
  • Windows配置tensorflow開發環境
    通過這篇文章,希望能夠幫助大家更加順利地配置tensorflow的開發環境。4、測試tensorflow是否可用可通過兩種方式測試tensorflow:(1)通過Anaconda Prompt窗口:首先,激活tensorflow環境。
  • TensorFlow 安裝詳解
    TensorFlow 介紹    2.1 什麼是 TensorFlow    2.2 TensorFlow 能做什麼3. 安裝 TensorFlow    3.1 安裝 pip    3.2 安裝 TensorFlow    3.3 運行 Hello,TensorFlow 案例4.
  • tensorflow機器學習模型的跨平臺上線
    生成的模型,但是由於tensorflow模型往往較大,使用無法優化的PMML文件大多數時候很笨拙,因此本文我們專門討論下tensorflow機器學習模型的跨平臺上線的方法。tensorflow模型的跨平臺上線的備選方案tensorflow模型的跨平臺上線的備選方案一般有三種:即PMML方式,tensorflow serving方式,以及跨語言API方式。PMML方式的主要思路在上一篇以及講過。
  • TensorFlow發布JavaScript開發者的機器學習框架TensorFlow.js
    發布新的 TensorFlow 官方博客(http://blog.tensorflow.org/)與 TensorFlow YouTube 頻道;2. 面向 JavaScript 開發者的全新機器學習框架 TensorFlow.js;3.
  • TensorFlow圖像分類教程
    在很多TensorFlow教程中最先且唯一依賴的就是Docker(應該表明這是個合理的開始)。我也更喜歡這種安裝TensorFlow的方法,因為不需要安裝一系列的依賴項,這可以保持主機(筆記本或桌面)比較乾淨。
  • 從零開始搭建深度學習伺服器:TensorFlow + PyTorch + Torch
    python-pip python-dev python-virtualenv mkdir tensorflowcd tensorflowvirtualenv --system-site-packages venvsource venv/bin/activatepip install --upgrade tensorflow-gpu測試GPU:
  • TensorFlow學習
    ,學習內容為tensorflow!if activation_function is None:        outputs = Wx_plus_b    else:        outputs = activation_function(Wx_plus_b)返回輸出return outputs完整函數import tensorflow
  • TensorFlow 的簡單例子 | Linux 中國
    在本文中,我們將看一些 TensorFlow 的例子,並從中感受到在定義張量tensor和使用張量做數學計算方面有多麼容易,我還會舉些別的機器學習相關的例子。TensorFlow 是什麼?TensorFlow 是 Google 為了解決複雜的數學計算耗時過久的問題而開發的一個庫。事實上,TensorFlow 能幹許多事。
  • 基於TensorFlow的深度學習實戰
    為了將環境建在 ~/tensorflow 目錄下, 執行:$ virtualenv --system-site-packages ~/tensorflow接下來激活virtualenv:$ source ~/tensorflow/bin/activate #  with bash $ source ~/tensorflow/bin/activate.csh
  • TensorFlow安裝與卷積模型
    使用pip安裝1)下載安裝Python 2)打開windows的命令行窗口,安裝CPU版本pip installtensorflow安裝GPU版本Pip install tensorflow-gpu之後驗證是否安裝了 TensorFlow 可以嘗試一下代碼>>> importtensorflow
  • 【官方教程】TensorFlow在圖像識別中的應用
    /main.cc:200] military uniform (866): 0.647296I tensorflow/examples/label_image/main.cc:200] suit (794): 0.0477196I tensorflow/examples/label_image/main.cc:200] academic gown (896): 0.0232411I tensorflow
  • tensorflow的數據輸入
    tensorflow有兩種數據輸入方法,比較簡單的一種是使用feed_dict,這種方法在畫graph的時候使用placeholder來站位,在真正