新聞中心
也許你已經(jīng)下載了TensorFlow,而且準備開始著手研究深度學(xué)習(xí)。但是你會疑惑:TensorFlow里面的Tensor,也就是“張量”,到底是個什么鬼?也許你查閱了維基百科,而且現(xiàn)在變得更加困惑。也許你在NASA教程中看到它,仍然不知道它在說些什么?問題在于大多數(shù)講述張量的指南,都假設(shè)你已經(jīng)掌握他們描述數(shù)學(xué)的所有術(shù)語。

創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)夏邑,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
別擔心!
[[192552]] 編譯 | 邵胖胖,江凡,笪潔瓊,Aileen
我像小孩子一樣討厭數(shù)學(xué),所以如果我能明白,你也可以!我們只需要用簡單的措辭來解釋這一切。所以,張量(Tensor)是什么,而且為什么會流動(Flow)?
讓我們先來看看tensor(張量)是什么?
張量=容器
張量是現(xiàn)代機器學(xué)習(xí)的基礎(chǔ)。它的核心是一個數(shù)據(jù)容器,多數(shù)情況下,它包含數(shù)字,有時候它也包含字符串,但這種情況比較少。因此把它想象成一個數(shù)字的水桶。
張量有多種形式,首先讓我們來看最基本的形式,你會在深度學(xué)習(xí)中偶然遇到,它們在0維到5維之間。我們可以把張量的各種類型看作這樣(對被題目中的貓咪吸引進來小伙伴說一句,不要急!貓咪在后面會出現(xiàn)哦!):
0維張量/標量
裝在張量/容器水桶中的每個數(shù)字稱為“標量”。
標量是一個數(shù)字。
你會問為什么不干脆叫它們一個數(shù)字呢?
我不知道,也許數(shù)學(xué)家只是喜歡聽起來酷?標量聽起來確實比數(shù)字酷。
實際上,你可以使用一個數(shù)字的張量,我們稱為0維張量,也就是一個只有0維的張量。它僅僅只是帶有一個數(shù)字的水桶。想象水桶里只有一滴水,那就是一個0維張量。
本教程中,我將使用Python,Keras,TensorFlow和Python庫Numpy。在Python中,張量通常存儲在Nunpy數(shù)組,Numpy是在大部分的AI框架中,一個使用頻率非常高的用于科學(xué)計算的數(shù)據(jù)包。
你將在Kaggle(數(shù)據(jù)科學(xué)競賽網(wǎng)站)上經(jīng)??吹絁upyter Notebooks(安裝見文末閱讀鏈接,“數(shù)學(xué)爛也要學(xué)AI:帶你造一個經(jīng)濟試用版AI終極必殺器”)關(guān)于把數(shù)據(jù)轉(zhuǎn)變成Numpy數(shù)組。Jupyter notebooks本質(zhì)上是由工作代碼標記嵌入。可以認為它把解釋和程序融為一體。
我們?yōu)槭裁聪氚褦?shù)據(jù)轉(zhuǎn)換為Numpy數(shù)組?
很簡單。因為我們需要把所有的輸入數(shù)據(jù),如字符串文本,圖像,股票價格,或者視頻,轉(zhuǎn)變?yōu)橐粋€統(tǒng)一得標準,以便能夠容易的處理。
這樣我們把數(shù)據(jù)轉(zhuǎn)變成數(shù)字的水桶,我們就能用TensorFlow處理。
它僅僅是組織數(shù)據(jù)成為可用的格式。在網(wǎng)頁程序中,你也許通過XML表示,所以你可以定義它們的特征并快速操作。同樣,在深度學(xué)習(xí)中,我們使用張量水桶作為基本的樂高積木。
1維張量/向量
如果你是名程序員,那么你已經(jīng)了解,類似于1維張量:數(shù)組。
每個編程語言都有數(shù)組,它只是單列或者單行的一組數(shù)據(jù)塊。在深度學(xué)習(xí)中稱為1維張量。張量是根據(jù)一共具有多少坐標軸來定義。1維張量只有一個坐標軸。
1維張量稱為“向量”。
我們可以把向量視為一個單列或者單行的數(shù)字。
如果想在Numpy得出此結(jié)果,按照如下方法:
我們可以通過NumPy’s ndim函數(shù),查看張量具有多個坐標軸。我們可以嘗試1維張量。
2維張量
你可能已經(jīng)知道了另一種形式的張量,矩陣——2維張量稱為矩陣
不,這不是基努·里維斯(Keanu Reeves)的電影《黑客帝國》,想象一個excel表格。
我們可以把它看作為一個帶有行和列的數(shù)字網(wǎng)格。
這個行和列表示兩個坐標軸,一個矩陣是二維張量,意思是有兩維,也就是有兩個坐標軸的張量。
在Numpy中,我們可以如下表示:
- x = np.array([[5,10,15,30,25],
- [20,30,65,70,90],
- [7,80,95,20,30]])
我們可以把人的特征存儲在一個二維張量。有一個典型的例子是郵件列表。
比如我們有10000人,我們有每個人的如下特性和特征:
- First Name(名)
- Last Name(姓)
- Street Address(街道地址)
- City(城市)
- State(州/省)
- Country(國家)
- Zip(郵政編碼)
這意味著我們有10000人的七個特征。
張量具有“形狀”,它的形狀是一個水桶,即裝著我們的數(shù)據(jù)也定義了張量的最大尺寸。我們可以把所有人的數(shù)據(jù)放進二維張量中,它是(10000,7)。
你也許想說它有10000列,7行。
不。
張量能夠被轉(zhuǎn)換和操作,從而使列變?yōu)樾谢蛘咝凶優(yōu)榱小?/p>
3維張量
這時張量真正開始變得有用,我們經(jīng)常需要把一系列的二維張量存儲在水桶中,這就形成了3維張量。
在NumPy中,我們可以表示如下:
- x = np.array([[[5,10,15,30,25],
- [20,30,65,70,90],
- [7,80,95,20,30]]
- [[3,0,5,0,45],
- [12,-2,6,7,90],
- [18,-9,95,120,30]]
- [[17,13,25,30,15],
- [23,36,9,7,80],
- [1,-7,-5,22,3]]])
你已經(jīng)猜到,一個三維張量有三個坐標軸,可以這樣看到:
- x.ndim
輸出為:
- 3
讓我們再看一下上面的郵件列表,現(xiàn)在我們有10個郵件列表,我們將存儲2維張量在另一個水桶里,創(chuàng)建一個3維張量,它的形狀如下:
- (number_of_mailing_lists, number_of_people, number_of_characteristics_per_person)
- (10,10000,7)
你也許已經(jīng)猜到它,但是一個3維張量是一個數(shù)字構(gòu)成的立方體。
我們可以繼續(xù)堆疊立方體,創(chuàng)建一個越來越大的張量,來編輯不同類型的數(shù)據(jù),也就是4維張量,5維張量等等,直到N維張量。N是數(shù)學(xué)家定義的未知數(shù),它是一直持續(xù)到無窮集合里的附加單位。它可以是5,10或者無窮。
實際上,3維張量最好視為一層網(wǎng)格,看起來有點像下圖:
存儲在張量數(shù)據(jù)中的公式
這里有一些存儲在各種類型張量的公用數(shù)據(jù)集類型:
- 3維=時間序列
- 4維=圖像
- 5維=視頻
幾乎所有的這些張量的共同之處是樣本量。樣本量是集合中元素的數(shù)量,它可以是一些圖像,一些視頻,一些文件或者一些推特。
通常,真實的數(shù)據(jù)至少是一個數(shù)據(jù)量。
把形狀里不同維數(shù)看作字段。我們找到一個字段的最小值來描述數(shù)據(jù)。
因此,即使4維張量通常存儲圖像,那是因為樣本量占據(jù)張量的第4個字段。
例如,一個圖像可以用三個字段表示:
- (width, height, color_depth) = 3D
但是,在機器學(xué)習(xí)工作中,我們經(jīng)常要處理不止一張圖片或一篇文檔——我們要處理一個集合。我們可能有10,000張郁金香的圖片,這意味著,我們將用到4D張量,就像這樣:
- (sample_size, width, height, color_depth) = 4D
我們來看看一些多維張量存儲模型的例子:
時間序列數(shù)據(jù)
用3D張量來模擬時間序列會非常有效!
醫(yī)學(xué)掃描——我們可以將腦電波(EEG)信號編碼成3D張量,因為它可以由這三個參數(shù)來描述:
- (time, frequency, channel)
這種轉(zhuǎn)化看起來就像這樣:
如果我們有多個病人的腦電波掃描圖,那就形成了一個4D張量:
- (sample_size, time, frequency, channel)
- Stock Prices
在交易中,股票每分鐘有最高、最低和最終價格。如下圖的蠟燭圖所示:
紐交所開市時間從早上9:30到下午4:00,即6.5個小時,總共有6.5 x 60 = 390分鐘。如此,我們可以將每分鐘內(nèi)最高、最低和最終的股價存入一個2D張量(390,3)。如果我們追蹤一周(五天)的交易,我們將得到這么一個3D張量:
- (week_of_data, minutes, high_low_price)
即:
- (5,390,3)
同理,如果我們觀測10只不同的股票,觀測一周,我們將得到一個4D張量
- (10,5,390,3)
假設(shè)我們在觀測一個由25只股票組成的共同基金,其中的每只股票由我們的4D張量來表示。那么,這個共同基金可以有一個5D張量來表示:
- (25,10,5,390,3)
文本數(shù)據(jù)
我們也可以用3D張量來存儲文本數(shù)據(jù),我們來看看推特的例子。
首先,推特有140個字的限制。其次,推特使用UTF-8編碼標準,這種編碼標準能表示百萬種字符,但實際上我們只對前128個字符感興趣,因為他們與ASCII碼相同。所以,一篇推特文可以包裝成一個2D向量:
- (140,128)
如果我們下載了一百萬篇川普哥的推文(印象中他一周就能推這么多),我們就會用3D張量來存:
- (number_of_tweets_captured, tweet, character)
這意味著,我們的川普推文集合看起來會是這樣:
- (1000000,140,128)
圖片
4D張量很適合用來存諸如JPEG這樣的圖片文件。之前我們提到過,一張圖片有三個參數(shù):高度、寬度和顏色深度。一張圖片是3D張量,一個圖片集則是4D,第四維是樣本大小。
著名的MNIST數(shù)據(jù)集是一個手寫的數(shù)字序列,作為一個圖像識別問題,曾在幾十年間困擾許多數(shù)據(jù)科學(xué)家。現(xiàn)在,計算機能以99%或更高的準確率解決這個問題。即便如此,這個數(shù)據(jù)集仍可以當做一個優(yōu)秀的校驗基準,用來測試新的機器學(xué)習(xí)算法應(yīng)用,或是用來自己做實驗。
Keras 甚至能用以下語句幫助我們自動導(dǎo)入MNIST數(shù)據(jù)集:
- from keras.datasets import mnist
- (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
這個數(shù)據(jù)集被分成兩個部分:訓(xùn)練集和測試集。數(shù)據(jù)集中的每張圖片都有一個標簽。這個標簽寫有正確的讀數(shù),例如3,7或是9,這些標簽都是通過人工判斷并填寫的。
訓(xùn)練集是用來訓(xùn)練神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法,測試集則用來校驗這個學(xué)習(xí)算法。
MNIST圖片是黑白的,這意味著它們可以用2D張量來編碼,但我們習(xí)慣于將所有的圖片用3D張量來編碼,多出來的第三個維度代表了圖片的顏色深度。
MNIST數(shù)據(jù)集有60,000張圖片,它們都是28 x 28像素,它們的顏色深度為1,即只有灰度。
TensorFlow這樣存儲圖片數(shù)據(jù):
- (sample_size, height, width, color_depth).
于是我們可以認為,MNIST數(shù)據(jù)集的4D張量是這樣的:
- (60000,28,28,1)
彩色圖片
彩色圖片有不同的顏色深度,這取決于它們的色彩(注:跟分辨率沒有關(guān)系)編碼。一張典型的JPG圖片使用RGB編碼,于是它的顏色深度為3,分別代表紅、綠、藍。
這是一張我美麗無邊的貓咪(Dove)的照片,750 x750像素,這意味著我們能用一個3D張量來表示它:
- (750,750,3)
My beautiful cat Dove (750 x 750 pixels)
這樣,我可愛的Dove將被簡化為一串冷冰冰的數(shù)字,就好像它變形或流動起來了。
然后,如果我們有一大堆不同類型的貓咪圖片(雖然都沒有Dove美),也許是100,000張吧,不是DOVE它的,750 x750像素的。我們可以在Keras中用4D張量來這樣定義:
- (10000,750,750,3)
5D張量
5D張量可以用來存儲視頻數(shù)據(jù)。TensorFlow中,視頻數(shù)據(jù)將如此編碼:
- (sample_size, frames, width, height, color_depth)
如果我們考察一段5分鐘(300秒),1080pHD(1920 x 1080像素),每秒15幀(總共4500幀),顏色深度為3的視頻,我們可以用4D張量來存儲它:
- (4500,1920,1080,3)
當我們有多段視頻的時候,張量中的第五個維度將被使用。如果我們有10段這樣的視頻,我們將得到一個5D張量:
- (10,4500,1920,1080,3)
實際上這個例子太瘋狂了!
這個張量的大是很荒謬的,超過1TB。我們姑且考慮下這個例子以便說明一個問題:在現(xiàn)實世界中,我們有時需要盡可能的縮小樣本數(shù)據(jù)以方便的進行處理計算,除非你有無盡的時間。
這個5D張量中值的數(shù)量為:
10 x 4500 x 1920 x 1080 x 3 = 279,936,000,000
在Keras中,我們可以用一個叫dype的數(shù)據(jù)類型來存儲32bits或64bits的浮點數(shù)
我們5D張量中的每一個值都將用32 bit來存儲,現(xiàn)在,我們以TB為單位來進行轉(zhuǎn)換:
279,936,000,000 x 32 = 8,957,952,000,000
這還只是保守估計,或許用32bit來儲存根本就不夠(誰來計算一下如果用64bit來存儲會怎樣),所以,減小你的樣本吧朋友。
事實上,我舉出這最后一個瘋狂的例子是有特殊目的的。我們剛學(xué)過數(shù)據(jù)預(yù)處理和數(shù)據(jù)壓縮。你不能什么工作也不做就把大堆數(shù)據(jù)扔向你的AI模型。你必須清洗和縮減那些數(shù)據(jù)讓后續(xù)工作更簡潔更高效。
降低分辨率,去掉不必要的數(shù)據(jù)(也就是去重處理),這大大縮減了幀數(shù),等等這也是數(shù)據(jù)科學(xué)家的工作。如果你不能很好地對數(shù)據(jù)做這些預(yù)處理,那么你幾乎做不了任何有意義的事。
結(jié)論
好了,現(xiàn)在你已經(jīng)對張量和用張量如何對接不同類型數(shù)據(jù)有了更好的了解。
原文:https://hackernoon.com/learning-ai-if-you-suck-at-math-p4-tensors-illustrated-with-cats-27f0002c9b32
【本文是專欄機構(gòu)大數(shù)據(jù)文摘的原創(chuàng)譯文,微信公眾號“大數(shù)據(jù)文摘( id: BigDataDigest)”】
文章題目:你真的懂TensorFlow嗎?Tensor是神馬?為什么還會Flow?
分享URL:http://www.5511xx.com/article/cosciec.html


咨詢
建站咨詢
