提起張量分析_由淺入深地帶你了解分析張量 大家在熟悉不過了,被越來越多的人所熟知,那你知道張量分析_由淺入深地帶你了解分析張量 嗎?快和小編一起去了解一下吧!
【資料圖】
張量分析(由淺入深,你知道分析張量)
神經 *** 的輸入、輸出和權值都是張量,神經 *** 中的各種計算和變換都是對張量的運算。張量,一種數據結構,是神經 *** 的基石。可以說,不理解張量,就沒有真正理解神經 *** 和人工智能。本文由淺入深地詳細講解了分析張量,希望對讀者有所啟發——宵遠。
張量的定義
張量是一個多維數組,即存儲一組數的數據結構,可以通過索引單獨訪問,也可以通過多個索引進行索引。
張量是向量和矩陣到任意維的推廣。如下圖所示,張量的維數與張量中用來表示標量值的索引數一致。
新張量=張量[索引]
張量的查看和存儲
點擊張量的存儲。ipynb進行深入研究。以下是該文件的主要內容:
張量,PyTorch中的基本數據結構
索引對PyTorch張量進行操作以探索和處理數據。
與NumPy多維數組的互操作性
將計算轉移到GPU以加快速度
張量的視圖定義和存儲
存儲是數字數據的一維數組,例如包含給定類型數字(可能是float或int32)的連續內存塊。張量是一種存儲的視圖,可以通過使用偏移和每個維度的每維度步驟將其索引到存儲中。的存儲布局永遠是一維的,與任何可能涉及它的張量的維數無關。
多個張量可以索引同一個存儲,即使它們索引數據的方式不同。但是底層內存只分配一次,所以無論存儲實例管理的數據有多大,都可以快速創建數據上的備選張量視圖。
張量觀的多維意義
張量的觀點就是我們如何理解張量,比如形狀為[2,4,4,3]的張量A。邏輯上我們可以理解為兩張圖片,每張4行4列,每個位置都有RGB 3通道的數據;張量的存儲體現在,張量作為一個連續的存儲區存儲在內存中。對于同一個存儲,我們可以有不同的理解方式,比如上面的A,在不改變張量存儲的情況下,我們可以把張量A理解為兩個樣本,每個樣本的特征都是一個長度為48的向量。這就是存儲和視圖的關系。
張量存儲的一維性
存儲數據時,內存不支持這種維度層次的概念,只能按順序分塊寫入內存。所以這種層次關系需要人工管理,即需要人工跟蹤每個張量的存儲順序。為了表達方便,我們把張量形狀左側的維度稱為大維度,形狀右側的維度稱為小維度。比如在[2,4,4,3]的張量中,與通道數相比,圖片數稱為大維,通道數稱為小維。在優先寫入小尺寸的設置下,形狀(2,3)張量的存儲布局如下:
[1.,4.,2.,1.,3.,5.]創建數據時,會根據初始維度順序寫入數據。改變張量的視圖只是改變了張量的理解公式,而不改變張量的存儲順序。這在一定程度上是因為計算效率的原因,大量數據的寫操作會消耗更多的計算資源。
張量存儲的形狀(大小)、存儲偏移量和步長
為了索引到存儲器中,張量依賴于一些信息,這些信息和它們的存儲器一起清楚地定義了它們:大小、存儲偏移和步長(如下)。
英文意思形狀是一個元組,表示張量表示的每個維度上有多少個元素。注意張量的形狀等同于存儲的大小。Step stride是一個元組,它指示當索引在每個維度上增加1時,存儲中必須跳過的元素的數量。存儲偏移量storage offset存儲張量中之一個元素對應的索引。
在上面的例子中,訪問二維張量中的元素(I,j)(i,j)的結果是訪問存儲中的$ storage _ offset+stride[0]I+stride[1]j $元素。
更一般化:對于形狀為(d1,d2,…,dn)的張量的視圖中的元素E(e1,e2,…,en)E(e1,e2,…,en),如果張量的存儲步長為stride (s1,s2,…,sn)
由此,我們得到張量視圖的計算公式:
張量視圖=張量存儲+張量形狀+張量步長+張量偏移
張量存儲對張量運算的影響
張量和存儲之間的這種間接性導致了一些操作,例如轉置張量或提取子張量。這些操作是廉價的,因為它們不會導致內存重新分配;相反,它們包括為新的張量對象分配不同的形狀、存儲偏移量或步長值。
張量的維數降低了,而索引的存儲空仍然與原來的點張量相同。改變子張量會對原張量產生副作用(子張量的修改會影響原張量)。但這種效應可能不會一直存在,因為子張量可以克隆成新的張量。
沒有分配新的內存:轉置只能通過創建一個新的張量實例來獲得,該實例的步長與原始張量的步長不同。您可以通過重新排列張量函數(如PyTorch中的tense()函數)來強制復制一個張量,使其布局與新創建的張量的布局相同。
張量的表示和存儲的區別和聯系
接觸
對于元素E (E1,E2,...,EN)在張量的視野中,其形狀是(D1,D2,...,DN),如果張量的存儲步長為(S1,S2,...,Sn)且存儲偏移量storage offset為s_o,則元素E的存儲位置索引為:
張量視圖=張量存儲+張量形狀+張量步長+張量偏移
區分
同一個存儲可以有不同的視圖:tensor_B.storage()與tensor_B_transpose.storage()相同,但tensor_B與tensor_B_transpose不同。
同一個視圖可以有不同的存儲:tensor_A與tensor_B_transpose相同,但tensor_A.storage()與tensor_B_transpose.storage()不同。
摘要:張量視圖與存儲之間的關系是通過索引建立的。兩者之間沒有必然,就是同一個存儲可以有不同的視圖,同一個視圖可以有不同的存儲。
張量運算
點擊TensorFlow張量的常用運算。ipynb了解更多信息。以下是該文件的主要內容:
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關鍵詞:
責任編輯:Rex_19