《Deep Learning with Python》第二章 2.2 神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)表示

2.2 神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)表示

在上面的例子中彻消,數(shù)據(jù)存儲(chǔ)為多維Numpy數(shù)組,也稱為張量(tensor)。當(dāng)前流行的機(jī)器學(xué)習(xí)系統(tǒng)都以張量作為基本數(shù)據(jù)結(jié)構(gòu)。所以Google的TensorFlow也拿張量命名津畸。那張量是什么呢?

張量是數(shù)據(jù)的容器(container)必怜。這里的數(shù)據(jù)一般是數(shù)值型數(shù)據(jù)肉拓,所以是數(shù)字的容器。大家所熟悉的矩陣是二維(2D)張量梳庆。張量是廣義的矩陣暖途,它的某一維也稱為軸(axis)卑惜。

  • 標(biāo)量(Scalar,0D 張量)

只包含一個(gè)數(shù)字的張量稱為標(biāo)量(或者數(shù)量張量丧肴,零維張量残揉,0D張量)胧后。在Numpy中芋浮,一個(gè)float32或者float64位的數(shù)值稱為數(shù)量張量。Numpy張量可用其ndim屬性顯示軸的序數(shù)壳快,數(shù)量張量有0個(gè)軸(ndim == 0)纸巷。張量的軸的序數(shù)也稱為階(rank)。下面是Numpy標(biāo)量:

>>> import numpy as np
        >>> x = np.array(12)
        >>> x
        array(12)
>>> x.ndim 0
  • 向量(1D張量)

數(shù)字的數(shù)組也稱為向量眶痰,或者一維張量(1D張量)瘤旨。一維張量只有一個(gè)軸。下面來看一個(gè)Numpy向量:

>>> x = np.array([12, 3, 6, 14])
        >>> x
        array([12, 3, 6, 14])
        >>> x.ndim
1

該向量有5項(xiàng)竖伯,也稱為5維的向量存哲。但是不要混淆5D向量和5D張量!一個(gè)5D向量只有一個(gè)軸七婴,以及沿該軸有5個(gè)維數(shù)(元素)祟偷;然而一個(gè)5D張量有5個(gè)軸,并且沿每個(gè)軸可以有任意個(gè)的維數(shù)打厘。維度既能表示沿某個(gè)軸的項(xiàng)的數(shù)量(比如修肠,上面的5D向量),又能表示一個(gè)張量中軸的數(shù)量(比如户盯,上面的5D張量)嵌施,時(shí)常容易混淆。對(duì)于后者莽鸭,用更準(zhǔn)確地技術(shù)術(shù)語來講吗伤,應(yīng)該稱為5階張量(張量的階即是軸的數(shù)量),但人們更常用的表示方式是5D張量硫眨。

  • 矩陣(2D張量)

向量的數(shù)組稱為矩陣牲芋,或者二維張量(2D張量)。矩陣有兩個(gè)軸捺球,也常稱為行和列缸浦。你可以將數(shù)字排成的矩形網(wǎng)格看成矩陣,下面是一個(gè)Numpy矩陣:

>>> x = np.array([[5, 78, 2, 34, 0],
                  [6, 79, 3, 35, 1],
                  [7, 80, 4, 36, 2]])
>>> x.ndim
2

沿著第一個(gè)軸的項(xiàng)稱為行氮兵,沿著第二個(gè)軸的項(xiàng)稱為列裂逐。上面的例子中,[5, 78, 2, 34, 0]是矩陣 x 第一行泣栈,[5, 6, 7]是第一列卜高。

  • 三維張量(3D張量)和更高維張量

矩陣的數(shù)組稱為三維張量(3D張量)弥姻,你可以將其看成是數(shù)字排列成的立方體,下面是一個(gè)Numpy三維張量:

>>> x = np.array([[[5, 78, 2, 34, 0],
                   [6, 79, 3, 35, 1],
                   [7, 80, 4, 36, 2]],
                   [[5, 78, 2, 34, 0],
                   [6, 79, 3, 35, 1],
                   [7, 80, 4, 36, 2]],
                   [[5, 78, 2, 34, 0],
                   [6, 79, 3, 35, 1],
                   [7, 80, 4, 36, 2]]])
>>> x.ndim
3

同理掺涛,將三維張量放進(jìn)數(shù)組可以創(chuàng)建四維張量庭敦,其它更高維的張量亦是如此。深度學(xué)習(xí)中常用的張量是 0D 到 4D薪缆。如果處理視頻數(shù)據(jù)秧廉,你會(huì)用到5D。

  • 關(guān)鍵屬性

    張量具有如下三個(gè)關(guān)鍵屬性:

    • 軸的數(shù)量(階數(shù)拣帽,rank):一個(gè)三維張量有3個(gè)軸疼电,矩陣有2個(gè)軸。Python Numpy中的張量維度為ndim减拭。
    • 形狀(shape):它是一個(gè)整數(shù)元組蔽豺,描述張量沿每個(gè)軸有多少維。例如拧粪,前面的例子中修陡,矩陣的形狀為(3,5)可霎,三維張量的形狀為(3魄鸦,3,5)啥纸。向量的形狀只有三個(gè)元素号杏,比如(3,)斯棒,標(biāo)量有空形狀盾致,()。
    • 數(shù)據(jù)類型:張量中包含的數(shù)據(jù)類型有float32荣暮,unit8庭惜,float64等等,調(diào)用Python的dtype屬性獲取穗酥。字符型張量是極少見的护赊。注意,Numpy中不存在字符串張量砾跃,其它大部分庫也不存在骏啰。因?yàn)閺埩看嬖谟陬A(yù)先申請(qǐng)的、連續(xù)的內(nèi)存分段抽高;而字符是變長(zhǎng)的判耕。

下面來幾個(gè)具體的例子,回看MNIST數(shù)據(jù)集翘骂。首先加載MNIST數(shù)據(jù)集:

from keras.datasets import moist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

接著壁熄,用ndim屬性顯示張量train_images的軸數(shù)量:

>>> print(train_images.ndim)
3

打印形狀:

>>> print(train_images.shape)
(60000, 28, 28)

使用dtype屬性打印數(shù)據(jù)類型:

>>> print(train_images.dtype)
uint8

所以train_images是一個(gè)8-bit 整數(shù)的三維張量帚豪。更確切地說,它是一個(gè)包含60,000個(gè)矩陣的數(shù)組草丧,其中每個(gè)矩陣是28 x 28 的整數(shù)狸臣。每個(gè)矩陣是一個(gè)灰度圖,其值為0到255昌执。

下面使用Python Matplotlib庫顯示三維張量中的第四幅數(shù)字圖烛亦,見圖2.2:

#Listing 2.6 Displaying the fourth digit
digit = train_images[4]
import matplotlib.pyplot as pet
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()
image

圖2.2 數(shù)字圖樣例

  • Numpy中的張量操作

上面的例子中,使用了train_images[i]沿第一個(gè)軸選擇指定的數(shù)字圖仙蚜。選擇張量的指定元素稱為張量分片(tensor slicing)此洲,下面看Numpy數(shù)組中的張量切片操作:

選擇#10到#100(不包括#100)的數(shù)字圖厂汗,對(duì)應(yīng)的張量形狀為(90委粉,28,28):

>>> my_slice = train_images[10:100]
>>> print(my_slice.shape)
(90, 28, 28)

其等效的表示方法有娶桦,沿每個(gè)軸為張量分片指定起始索引和終止索引贾节。注意,“:”等效于選擇整個(gè)軸的數(shù)據(jù):

>>> my_slice = train_images[10:100, :, :]
>>> my_slice.shape
(90, 28, 28)
>>> my_slice = train_images[10:100, 0:28, 0:28]
>>> my_slice.shape
(90, 28, 28)

一般衷畦,你可以沿著張量每個(gè)軸任意選擇兩個(gè)索引之間的元素栗涂。例如,選擇所有圖片的右下角的14 x 14的像素:

my_slice = train_images[:, 14:, 14:]

你也可以用負(fù)索引祈争。就像Python list中的負(fù)索引一樣斤程,它表示相對(duì)于當(dāng)前軸末端的位置。剪切圖片中間14 x 14像素菩混,使用如下的方法:

my_slice = train_images[:, 7:-7, 7:-7]
  • 批量數(shù)據(jù)(batch)的表示

    在深度學(xué)習(xí)中忿墅,張量數(shù)據(jù)的第一個(gè)軸(axis 0,軸的序數(shù)從0開始)一般是樣本軸(sample axis)沮峡,有時(shí)也稱為樣本維度(sample dimension )疚脐。在MNIST手寫數(shù)字識(shí)別的例子中,樣本是數(shù)字圖片邢疙。

    另外棍弄,深度學(xué)習(xí)模型不會(huì)一次處理整個(gè)數(shù)據(jù)集,而是將其拆分成小批量的數(shù)據(jù)集疟游。下面是一個(gè)MNIST手寫數(shù)字的batch呼畸,其中batch大小為128:

    batch = train_images[:128]
    

    接著下一個(gè)batch:

    batch = train_images[128:256]
    

    第n個(gè)batch:

    batch = train_images[128 * n:128 * (n + 1)]
    

    對(duì)于張量batch來說,第一個(gè)軸(axis 0)稱為batch軸或者batch維度颁虐。在使用Keras和其它深度學(xué)習(xí)庫時(shí)會(huì)遇到這個(gè)術(shù)語蛮原。

  • 真實(shí)世界中的張量數(shù)據(jù)

    下面來一些具體的張量例子,后續(xù)也會(huì)用到聪廉。大部分張量都可以歸為以下幾類:

    • 向量數(shù)據(jù):形狀為(樣本瞬痘,特征)[^ (samples, features) ]的二維張量
    • 時(shí)序數(shù)據(jù)(timeseries data)或者序列數(shù)據(jù)(sequence data):形狀為(樣本故慈,時(shí)間戳,特征)[^(samples, timesteps, features)]的三維張量
    • 圖片數(shù)據(jù):形狀為(樣本框全,高度察绷,寬度,管道)[^(samples, height, width, channels)]或者(樣本津辩,管道拆撼,高度,寬度)[^(samples, channels, height, width)]的四維張量
    • 視頻數(shù)據(jù):形狀為(樣本喘沿,幀闸度,高度,寬度蚜印,管道)[^(samples, frames, height, width, channels)]或者(樣本莺禁,幀,管道窄赋,高度哟冬,寬度)[^(samples, frames, channels, height, width)]的五維張量
  • 向量數(shù)據(jù)

    向量數(shù)據(jù)是最常見的例子。在數(shù)據(jù)集中忆绰,單個(gè)數(shù)據(jù)點(diǎn)可以編碼成一個(gè)向量浩峡,然后一批向量數(shù)據(jù)可以編碼成二維張量(即,向量的數(shù)組)错敢,其中第一個(gè)軸為樣本軸(samples axis)翰灾,第二個(gè)軸為特征軸(features axis)。

    下面來看兩個(gè)實(shí)例:

    • 人口數(shù)據(jù):這里考慮人的年齡稚茅,郵政編碼和收入纸淮。每個(gè)人的特征是一個(gè)包含3個(gè)值的向量,因此100,000個(gè)人的數(shù)據(jù)集存儲(chǔ)為形狀為(100000峰锁,3)的二維張量
    • 文本數(shù)據(jù):這里每個(gè)文檔用詞匯表(考慮20,000個(gè)常用詞的字典)中每個(gè)詞出現(xiàn)的次數(shù)來表示萎馅。那么每個(gè)文檔編碼成一個(gè)包含20,000個(gè)值(詞匯表中每個(gè)詞一個(gè)值)的向量。因此虹蒋,500個(gè)文檔的數(shù)據(jù)集存儲(chǔ)為形狀為(500糜芳,20000)的張量
  • 時(shí)序數(shù)據(jù)或者序列數(shù)據(jù)

    當(dāng)樣本數(shù)據(jù)集中時(shí)間或者序列的排序較為重要,你應(yīng)該將數(shù)據(jù)集存儲(chǔ)為帶顯式的時(shí)間軸(time axis)的三維張量魄衅。每個(gè)樣本編碼成一個(gè)向量的序列(二維張量)峭竣,因此,一批二維張量數(shù)據(jù)可以編碼成三維張量晃虫,見圖2.3:

    image

    圖2.3 三維時(shí)序張量數(shù)據(jù)

    習(xí)慣上皆撩,時(shí)間軸是第二個(gè)軸(軸序數(shù)為1)。下面看幾個(gè)例子:

    • 股票價(jià)格數(shù)據(jù):每分鐘保存股票的當(dāng)前價(jià)格,上一分鐘的最高價(jià)格扛吞,上一分鐘的最低價(jià)格呻惕。每分鐘的股票價(jià)格編碼成一個(gè)三維向量,一整天的股票交易編碼成形狀為(390滥比,3)的二維張量(股票交易每天有390分鐘)亚脆。250天的股票數(shù)據(jù)存儲(chǔ)為(250,390盲泛,3)的三維張量濒持。這里每個(gè)樣本為一天的股票交易數(shù)據(jù)。
    • 推特消息數(shù)據(jù):這里用128個(gè)不重復(fù)的字符表將每條推文編碼成280字符序列寺滚。每個(gè)字符編碼成大小為128的二進(jìn)制向量(該字符所在的索引位置的項(xiàng)為1柑营,其它值都為0)。每條推文編碼成形狀為(280村视,128)的二維張量官套,那么1億條推文存儲(chǔ)為(1000000,280蓖议,128)的張量虏杰。
  • 圖片數(shù)據(jù)

    圖片典型有三個(gè)維度:高度讥蟆、寬度和顏色深度勒虾。灰度圖片(比如MNIST手寫數(shù)字圖片)僅有一個(gè)顏色通道瘸彤,因此可以存儲(chǔ)為二維張量修然,但是習(xí)慣上圖片張量都是三維的,因此灰度圖片只用一維顏色管道表示质况。128張大小為256 x 256的灰度圖片存儲(chǔ)成形狀為(128愕宋,256,256结榄,1)的張量中贝,128張彩色圖片存儲(chǔ)成形狀為(128,256臼朗,256邻寿,1)的張量,見圖2.4视哑。

    image

    圖片張量有兩種寫法:顏色管道在后(TensorFlow的寫法)绣否,顏色管道在前(Theano的寫法)。谷歌的TensorFlow機(jī)器學(xué)習(xí)框架將顏色深度軸放在末尾:(樣本挡毅,高度蒜撮,寬度,管道)[^(samples, height, width, channels)]跪呈。同時(shí)段磨,Theano將顏色深度軸放在batch軸右邊取逾。按Theano的寫法,前面的例子寫成(128苹支,1菌赖,256,256)和(128沐序,3琉用,256,256)策幼。Keras深度學(xué)習(xí)框架對(duì)兩種表示方法都支持邑时。

  • 視頻數(shù)據(jù)

    視頻數(shù)據(jù)是現(xiàn)實(shí)世界中少有的幾種需用五維張量表示的數(shù)據(jù)。視頻可以理解成幀的序列特姐,每幀是一副彩色圖片晶丘。因?yàn)槊繋侨S張量(高度,寬度唐含,管道)浅浮,所以幀的序列存儲(chǔ)成四維張量(幀,高度捷枯,寬度滚秩,管道)。那不同的視頻就要存儲(chǔ)為五維張量了(樣本淮捆,幀郁油,高度,寬度攀痊,管道)[^(samples, frames, height, width, channels)]桐腌。

    例如,一個(gè)60秒苟径,144 x 256的油管視頻按每秒采樣4幀將會(huì)有240幀案站。那么4個(gè)不同的視頻采樣存儲(chǔ)為形狀為(4,240棘街,144蟆盐,256,3)蹬碧,總共有106,168,320個(gè)值舱禽。如果數(shù)據(jù)類型dtype為float32,那每個(gè)值保存為32位恩沽,所以該張量表示占405MB誊稚。而在真實(shí)生活中,你看到的視頻都不用float32保存,一般都用大塊數(shù)據(jù)存儲(chǔ)格式(比如MPEG格式)壓縮里伯。

未完待續(xù)城瞎。。疾瓮。

Enjoy!

翻譯本書系列的初衷是脖镀,覺得其中把深度學(xué)習(xí)講解的通俗易懂。不光有實(shí)例狼电,也包含作者多年實(shí)踐對(duì)深度學(xué)習(xí)概念蜒灰、原理的深度理解。最后說不重要的一點(diǎn)肩碟,F(xiàn)ran?ois Chollet是Keras作者强窖。
聲明本資料僅供個(gè)人學(xué)習(xí)交流、研究削祈,禁止用于其他目的翅溺。如果喜歡,請(qǐng)購買英文原版髓抑。


俠天咙崎,專注于大數(shù)據(jù)、機(jī)器學(xué)習(xí)和數(shù)學(xué)相關(guān)的內(nèi)容吨拍,并有個(gè)人公眾號(hào):bigdata_ny分享相關(guān)技術(shù)文章褪猛。

若發(fā)現(xiàn)以上文章有任何不妥,請(qǐng)聯(lián)系我密末。

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末握爷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子严里,更是在濱河造成了極大的恐慌,老刑警劉巖追城,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刹碾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡座柱,警方通過查閱死者的電腦和手機(jī)迷帜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來色洞,“玉大人戏锹,你說我怎么就攤上這事』鹬睿” “怎么了锦针?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我奈搜,道長(zhǎng)悉盆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任馋吗,我火速辦了婚禮焕盟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宏粤。我一直安慰自己脚翘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布绍哎。 她就那樣靜靜地躺著堰怨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛇摸。 梳的紋絲不亂的頭發(fā)上备图,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音赶袄,去河邊找鬼揽涮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饿肺,可吹牛的內(nèi)容都是我干的蒋困。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敬辣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼雪标!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起溉跃,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤村刨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后撰茎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嵌牺,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年龄糊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逆粹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炫惩,死狀恐怖僻弹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情他嚷,我是刑警寧澤蹋绽,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布芭毙,位于F島的核電站,受9級(jí)特大地震影響蟋字,放射性物質(zhì)發(fā)生泄漏稿蹲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一鹊奖、第九天 我趴在偏房一處隱蔽的房頂上張望苛聘。 院中可真熱鬧,春花似錦忠聚、人聲如沸设哗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽网梢。三九已至,卻和暖如春赂毯,著一層夾襖步出監(jiān)牢的瞬間战虏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工党涕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烦感,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓膛堤,卻偏偏與公主長(zhǎng)得像手趣,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肥荔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容