Tensorflow是什么?針對(duì)這個(gè)問(wèn)題,這篇文章給出了相對(duì)應(yīng)的分析和解答,希望能幫助更多想解決這個(gè)問(wèn)題的朋友找到更加簡(jiǎn)單易行的辦法。
成都創(chuàng)新互聯(lián)于2013年開(kāi)始,先為蕭山等服務(wù)建站,蕭山等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為蕭山企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。說(shuō)明:本文實(shí)例使用Python版本為3.5.6,Tensorflow版本為2.0
介紹
Tensorflow是Google推出的機(jī)器學(xué)習(xí)開(kāi)源神器,對(duì)Python有著良好的語(yǔ)言支持,支持CPU,GPU和Google TPU等硬件,并且已經(jīng)擁有了各種各樣的模型和算法。目前,Tensorflow已被廣泛應(yīng)用于文本處理,語(yǔ)音識(shí)別和圖像識(shí)別等多項(xiàng)機(jī)器學(xué)習(xí)和深度學(xué)習(xí)領(lǐng)域。
基礎(chǔ)框架
分為三層:應(yīng)用層、接口層和核心層
應(yīng)用層
提供了機(jī)器學(xué)習(xí)相關(guān)的訓(xùn)練庫(kù)、預(yù)測(cè)庫(kù)和針對(duì)Python、C++和Java等變成語(yǔ)言的編程環(huán)境,類似于web系統(tǒng)的前端,主要實(shí)現(xiàn)了對(duì)計(jì)算圖的構(gòu)造。
接口層
對(duì)Tensorflow功能模塊的封裝,便于其它語(yǔ)言平臺(tái)的調(diào)用。
核心層
最重要的部分,包括設(shè)備層、網(wǎng)絡(luò)層、數(shù)據(jù)操作層和圖計(jì)算層,執(zhí)行應(yīng)用層的計(jì)算。
1.設(shè)備層
包括Tensorflow在不同硬件設(shè)備上的實(shí)現(xiàn),主要支持CPU、GPU和Mobile等設(shè)備,在不同硬件設(shè)備上實(shí)現(xiàn)計(jì)算命令的轉(zhuǎn)換,給上層提供統(tǒng)一的接口,實(shí)現(xiàn)程序的跨平臺(tái)功能。
2.網(wǎng)絡(luò)層
網(wǎng)絡(luò)層主要包括RPC和RDMA通信協(xié)議,實(shí)現(xiàn)不同設(shè)備之間的數(shù)據(jù)傳輸和更新,這些協(xié)議都會(huì)在分布式計(jì)算中用到。
3.數(shù)據(jù)操作層
以tensor為處理對(duì)象,實(shí)現(xiàn)tensor的各種操作和計(jì)算。
4.圖計(jì)算層
包括分布式計(jì)算圖和本地計(jì)算圖的實(shí)現(xiàn),實(shí)現(xiàn)圖的創(chuàng)建、編譯、優(yōu)化和執(zhí)行等。
設(shè)計(jì)理念
可以將Tensorflow理解為一張計(jì)算圖中“張量的流動(dòng)”,其中,Tensor(張量)代表了計(jì)算圖中的邊,F(xiàn)low(流動(dòng))代表了計(jì)算圖中節(jié)點(diǎn)所做的操作而形成的數(shù)據(jù)流動(dòng)。
其設(shè)計(jì)理念是以數(shù)據(jù)流為核心,當(dāng)構(gòu)建相應(yīng)的機(jī)器學(xué)習(xí)模型后,使用訓(xùn)練數(shù)據(jù)在模型中進(jìn)行數(shù)據(jù)流動(dòng),同時(shí)將結(jié)果以反向傳播的方式反饋給模型中的參數(shù),以進(jìn)行調(diào)參,使用調(diào)整后的參數(shù)對(duì)訓(xùn)練數(shù)據(jù)再次進(jìn)行迭代計(jì)算。
編程特點(diǎn)
有兩個(gè)編程特點(diǎn):
圖的定義和圖的運(yùn)行完全分開(kāi)
在tensorflow中,需要預(yù)先定義各種變量,建立相關(guān)的數(shù)據(jù)流圖,在數(shù)據(jù)流圖中創(chuàng)建各種變量之間的計(jì)算關(guān)系,完成圖的定義,需要把運(yùn)算的輸入數(shù)據(jù)放進(jìn)去后,才會(huì)形成輸出值。
圖的計(jì)算在會(huì)話中執(zhí)行
tensorflow的相關(guān)計(jì)算在圖中進(jìn)行定義,而圖的具體運(yùn)行壞境在會(huì)話(session)中,開(kāi)啟會(huì)話后,才能開(kāi)始計(jì)算,關(guān)閉會(huì)話就不能再進(jìn)行計(jì)算了。
舉個(gè)例子:
import tensorflow as tf tf.compat.v1.disable_eager_execution() a = 3 b = 4 c = 5 y = tf.add(a*b, c) print(y) a = tf.constant(3, tf.int32) b = tf.constant(4, tf.int32) c = tf.constant(5, tf.int32) y = tf.add(a*b, c) print(y) session = tf.compat.v1.Session() print(session.run(y)) session.close()
可以看出,在圖創(chuàng)建后,并在會(huì)話中執(zhí)行數(shù)據(jù)計(jì)算,最終輸出結(jié)果。
設(shè)計(jì)的好處就是:學(xué)習(xí)的過(guò)程中,消耗最多的是對(duì)數(shù)據(jù)的訓(xùn)練,這樣設(shè)計(jì)的話,當(dāng)進(jìn)行計(jì)算時(shí),圖已經(jīng)確定,計(jì)算就只剩下一個(gè)不斷迭代的過(guò)程。
基本概念
Tensor
張量,是tensorflow中最主要的數(shù)據(jù)結(jié)構(gòu),張量用于在計(jì)算圖中進(jìn)行數(shù)據(jù)傳遞,創(chuàng)建了張量后,需要將其賦值給一個(gè)變量或占位符,之后才會(huì)將該張量添加到計(jì)算圖中。
session
會(huì)話,是Tensorflow中計(jì)算圖的具體執(zhí)行者,與圖進(jìn)行實(shí)際的交互。一個(gè)會(huì)話中可以有多個(gè)圖,會(huì)話的主要目的是將訓(xùn)練數(shù)據(jù)添加到圖中進(jìn)行計(jì)算,也可以修改圖的結(jié)構(gòu)。
調(diào)用模式推薦使用with語(yǔ)句:
with session: session.run() Variable
變量,表示圖中的各個(gè)計(jì)算參數(shù),通過(guò)調(diào)整這些變量的狀態(tài)來(lái)優(yōu)化機(jī)器學(xué)習(xí)算法。創(chuàng)建變量應(yīng)使用tf.Variable(),通過(guò)輸入一個(gè)張量,返回一個(gè)變量,變量聲明后需進(jìn)行初始化才能使用。
舉例說(shuō)明:
import tensorflow as tf tf.compat.v1.disable_eager_execution() tensor = tf.ones([1, 3]) test_var = tf.Variable(tensor) # 初始化變量 init_op = tf.compat.v1.global_variables_initializer() session = tf.compat.v1.Session() with session: print("tensor is ", session.run(tensor)) # print("test_var is ", session.run(test_var)) session.run(init_op) print("after init, test_var is", session.run(test_var))
Placeholder
占位符,用于表示輸入輸出數(shù)據(jù)的格式,聲明了數(shù)據(jù)位置,允許傳入指定類型和形狀的數(shù)據(jù),通過(guò)會(huì)話中的feed_dict參數(shù)獲取數(shù)據(jù),在計(jì)算圖運(yùn)行時(shí)使用獲取的數(shù)據(jù)進(jìn)行計(jì)算,計(jì)算完畢后獲取的數(shù)據(jù)就會(huì)消失。
舉例說(shuō)明:
x = tf.compat.v1.placeholder(tf.int32) y = tf.compat.v1.placeholder(tf.int32) z = tf.add(x, y) session = tf.compat.v1.Session() with session: print(session.run([z], feed_dict={x: [1, 2], y: [2, 3]}))
Operation
操作,是圖中的節(jié)點(diǎn),輸入輸出都是Tensor,作用是完成各種操作,包括:
數(shù)學(xué)運(yùn)算:add, sub, mul, div, exp ...
數(shù)組運(yùn)算:concat, slice, split, rank ...
矩陣運(yùn)算:matmul, matrixinverse ...
神經(jīng)網(wǎng)絡(luò)構(gòu)建:softmax, sigmoid, relu ...
檢查點(diǎn):save, restore ...
隊(duì)列和同步:enqueue, dequeue, mutexacquire, mutexrelease ...
張量控制:merge, switch, enter, leave ...
Queue
隊(duì)列,圖中有狀態(tài)的節(jié)點(diǎn)。包含入列(endqueue)和出列(dequeue)兩個(gè)操作,入列返回計(jì)算圖中的一個(gè)操作節(jié)點(diǎn),出列返回一個(gè)tensor值。
其中,隊(duì)列有兩種:
1. FIFOQueue
按入列順序出列的隊(duì)列,在需要讀入的訓(xùn)練樣本有序時(shí)使用。舉個(gè)例子:
fifo_queue = tf.compat.v1.FIFOQueue(10, 'int32') init = fifo_queue.enqueue_many(([1, 2, 3, 4, 5, 6], )) with tf.compat.v1.Session() as session: session.run(init) queue_size = session.run(fifo_queue.size()) for item in range(queue_size): print('fifo_queue', session.run(fifo_queue.dequeue()))
2. RandomShuffleQueue
以隨機(jī)順序出列的隊(duì)列,讀入的訓(xùn)練樣本無(wú)序時(shí)使用。舉個(gè)例子:
rs_queue = tf.compat.v1.RandomShuffleQueue(capacity=5, min_after_dequeue=0, dtypes='int32') init = rs_queue.enqueue_many(([1, 2, 3, 4, 5], )) with tf.compat.v1.Session() as session: session.run(init) queue_size = session.run(rs_queue.size()) for i in range(queue_size): print('rs_queue', session.run(rs_queue.dequeue()))
關(guān)于Tensorflow的介紹就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。