提起張量分析_由淺入深地帶你了解分析張量 大家在熟悉不過了,被越來越多的人所熟知,那你知道張量分析_由淺入深地帶你了解分析張量 嗎?快和小編一起去了解一下吧!
【資料圖】
張量分析(由淺入深,你知道分析張量)
神經(jīng) *** 的輸入、輸出和權(quán)值都是張量,神經(jīng) *** 中的各種計(jì)算和變換都是對張量的運(yùn)算。張量,一種數(shù)據(jù)結(jié)構(gòu),是神經(jīng) *** 的基石。可以說,不理解張量,就沒有真正理解神經(jīng) *** 和人工智能。本文由淺入深地詳細(xì)講解了分析張量,希望對讀者有所啟發(fā)——宵遠(yuǎn)。
張量的定義
張量是一個(gè)多維數(shù)組,即存儲(chǔ)一組數(shù)的數(shù)據(jù)結(jié)構(gòu),可以通過索引單獨(dú)訪問,也可以通過多個(gè)索引進(jìn)行索引。
張量是向量和矩陣到任意維的推廣。如下圖所示,張量的維數(shù)與張量中用來表示標(biāo)量值的索引數(shù)一致。
新張量=張量[索引]
張量的查看和存儲(chǔ)
點(diǎn)擊張量的存儲(chǔ)。ipynb進(jìn)行深入研究。以下是該文件的主要內(nèi)容:
張量,PyTorch中的基本數(shù)據(jù)結(jié)構(gòu)
索引對PyTorch張量進(jìn)行操作以探索和處理數(shù)據(jù)。
與NumPy多維數(shù)組的互操作性
將計(jì)算轉(zhuǎn)移到GPU以加快速度
張量的視圖定義和存儲(chǔ)
存儲(chǔ)是數(shù)字?jǐn)?shù)據(jù)的一維數(shù)組,例如包含給定類型數(shù)字(可能是float或int32)的連續(xù)內(nèi)存塊。張量是一種存儲(chǔ)的視圖,可以通過使用偏移和每個(gè)維度的每維度步驟將其索引到存儲(chǔ)中。的存儲(chǔ)布局永遠(yuǎn)是一維的,與任何可能涉及它的張量的維數(shù)無關(guān)。
多個(gè)張量可以索引同一個(gè)存儲(chǔ),即使它們索引數(shù)據(jù)的方式不同。但是底層內(nèi)存只分配一次,所以無論存儲(chǔ)實(shí)例管理的數(shù)據(jù)有多大,都可以快速創(chuàng)建數(shù)據(jù)上的備選張量視圖。
張量觀的多維意義
張量的觀點(diǎn)就是我們?nèi)绾卫斫鈴埩浚热缧螤顬閇2,4,4,3]的張量A。邏輯上我們可以理解為兩張圖片,每張4行4列,每個(gè)位置都有RGB 3通道的數(shù)據(jù);張量的存儲(chǔ)體現(xiàn)在,張量作為一個(gè)連續(xù)的存儲(chǔ)區(qū)存儲(chǔ)在內(nèi)存中。對于同一個(gè)存儲(chǔ),我們可以有不同的理解方式,比如上面的A,在不改變張量存儲(chǔ)的情況下,我們可以把張量A理解為兩個(gè)樣本,每個(gè)樣本的特征都是一個(gè)長度為48的向量。這就是存儲(chǔ)和視圖的關(guān)系。
張量存儲(chǔ)的一維性
存儲(chǔ)數(shù)據(jù)時(shí),內(nèi)存不支持這種維度層次的概念,只能按順序分塊寫入內(nèi)存。所以這種層次關(guān)系需要人工管理,即需要人工跟蹤每個(gè)張量的存儲(chǔ)順序。為了表達(dá)方便,我們把張量形狀左側(cè)的維度稱為大維度,形狀右側(cè)的維度稱為小維度。比如在[2,4,4,3]的張量中,與通道數(shù)相比,圖片數(shù)稱為大維,通道數(shù)稱為小維。在優(yōu)先寫入小尺寸的設(shè)置下,形狀(2,3)張量的存儲(chǔ)布局如下:
[1.,4.,2.,1.,3.,5.]創(chuàng)建數(shù)據(jù)時(shí),會(huì)根據(jù)初始維度順序?qū)懭霐?shù)據(jù)。改變張量的視圖只是改變了張量的理解公式,而不改變張量的存儲(chǔ)順序。這在一定程度上是因?yàn)橛?jì)算效率的原因,大量數(shù)據(jù)的寫操作會(huì)消耗更多的計(jì)算資源。
張量存儲(chǔ)的形狀(大小)、存儲(chǔ)偏移量和步長
為了索引到存儲(chǔ)器中,張量依賴于一些信息,這些信息和它們的存儲(chǔ)器一起清楚地定義了它們:大小、存儲(chǔ)偏移和步長(如下)。
英文意思形狀是一個(gè)元組,表示張量表示的每個(gè)維度上有多少個(gè)元素。注意張量的形狀等同于存儲(chǔ)的大小。Step stride是一個(gè)元組,它指示當(dāng)索引在每個(gè)維度上增加1時(shí),存儲(chǔ)中必須跳過的元素的數(shù)量。存儲(chǔ)偏移量storage offset存儲(chǔ)張量中之一個(gè)元素對應(yīng)的索引。
在上面的例子中,訪問二維張量中的元素(I,j)(i,j)的結(jié)果是訪問存儲(chǔ)中的$ storage _ offset+stride[0]I+stride[1]j $元素。
更一般化:對于形狀為(d1,d2,…,dn)的張量的視圖中的元素E(e1,e2,…,en)E(e1,e2,…,en),如果張量的存儲(chǔ)步長為stride (s1,s2,…,sn)
由此,我們得到張量視圖的計(jì)算公式:
張量視圖=張量存儲(chǔ)+張量形狀+張量步長+張量偏移
張量存儲(chǔ)對張量運(yùn)算的影響
張量和存儲(chǔ)之間的這種間接性導(dǎo)致了一些操作,例如轉(zhuǎn)置張量或提取子張量。這些操作是廉價(jià)的,因?yàn)樗鼈儾粫?huì)導(dǎo)致內(nèi)存重新分配;相反,它們包括為新的張量對象分配不同的形狀、存儲(chǔ)偏移量或步長值。
張量的維數(shù)降低了,而索引的存儲(chǔ)空仍然與原來的點(diǎn)張量相同。改變子張量會(huì)對原張量產(chǎn)生副作用(子張量的修改會(huì)影響原張量)。但這種效應(yīng)可能不會(huì)一直存在,因?yàn)樽訌埩靠梢钥寺〕尚碌膹埩俊?/p>
沒有分配新的內(nèi)存:轉(zhuǎn)置只能通過創(chuàng)建一個(gè)新的張量實(shí)例來獲得,該實(shí)例的步長與原始張量的步長不同。您可以通過重新排列張量函數(shù)(如PyTorch中的tense()函數(shù))來強(qiáng)制復(fù)制一個(gè)張量,使其布局與新創(chuàng)建的張量的布局相同。
張量的表示和存儲(chǔ)的區(qū)別和聯(lián)系
接觸
對于元素E (E1,E2,...,EN)在張量的視野中,其形狀是(D1,D2,...,DN),如果張量的存儲(chǔ)步長為(S1,S2,...,Sn)且存儲(chǔ)偏移量storage offset為s_o,則元素E的存儲(chǔ)位置索引為:
張量視圖=張量存儲(chǔ)+張量形狀+張量步長+張量偏移
區(qū)分
同一個(gè)存儲(chǔ)可以有不同的視圖:tensor_B.storage()與tensor_B_transpose.storage()相同,但tensor_B與tensor_B_transpose不同。
同一個(gè)視圖可以有不同的存儲(chǔ):tensor_A與tensor_B_transpose相同,但tensor_A.storage()與tensor_B_transpose.storage()不同。
摘要:張量視圖與存儲(chǔ)之間的關(guān)系是通過索引建立的。兩者之間沒有必然,就是同一個(gè)存儲(chǔ)可以有不同的視圖,同一個(gè)視圖可以有不同的存儲(chǔ)。
張量運(yùn)算
點(diǎn)擊TensorFlow張量的常用運(yùn)算。ipynb了解更多信息。以下是該文件的主要內(nèi)容:
dtype=int32,float32,string,booltf.convert_to_tensor,tf.constant,tf.zeros,tf.ones,tf.zeros_like,tf.fill,tf.random.normal,tf.random.uniform,tf.rangeA[1][2][1],A[1,2,1],A[:,:,0:3:2],A[...,0:3:2]tf.reshape,tf.expand_dims,tf.squeeze,tf.transposetf.tile+,-,*,/,//,%,**,tf.pow,tf.square,tf.sqrt,tf.math.log,tf.matmul,@tf.concat,tf.stack,tf.split,tf.unstacktf.norm,tf.reduce_maxminmeansum,tf.argmax,tf.argmintf.equaltf.pad,tf.keras.preprocessing.sequence.pad_sequences,tf.tiletf.maximum,tf.minimum,tf.clip_by_valuetf.gather,tf.gather_ndtf.boolean_masktf.wheretf.scatter_ndtf.meshgrid關(guān)鍵詞:
責(zé)任編輯:Rex_19