Tensorflow2 0四維張量的索引和切片問題

2021-10-02 08:51:42 字數 2919 閱讀 7566

切片在 tensorflow 中,支援基本的[?][?] …標準索引方式,也支援通過逗號分隔索引號的索引方式。考慮輸入x 為4 張32x32 大小的彩色,shape 為[4,32,32,3],首先建立張量:

x = tf.random.normal([4,32,32,3])

接下來我們使用索引方式讀取張量的部分資料。

in [51]: x[0]

out[51]:

in [52]: x[0][1]

out[52]:

in [53]: x[0][1][2]

out[53]:

in [54]: x[2][1][0][1]

out[54]:

當張量的維度數較高時,使用[?][?]. . . [?]的方式書寫不方便,可以採用[?, ?, … , ?]的方式索引,它們是等價的。

in [55]: x[1,9,2]

out[55]:

4.6 索引與切片[在此處鍵入] 17

通過?????: ???: ????切片方式可以方便地提取一段資料,其中start 為開始讀取位置的

索引,end 為結束讀取位置的索引(不包含end 位),step 為讀取步長

以 shape 為[4,32,32,3]的張量為例:

in [56]: x[1:3]

out[56]:

start: end: step切片方式有很多簡寫方式,其中start、end、step 3 個引數可以根據需要選擇性地省略,全部省略時即::,表示從最開始讀取到最末尾,步長為1,即不跳過任何元in [57]: x[0,::]

out[57]:

為了更加簡潔,::可以簡寫為單個冒號:,如

in [58]: x[:,0:28:2,0:28:2,:]

out[58]:

表示取所有,隔行取樣,隔列取樣,所有通道資訊,相當於在的高寬各縮放至原來的50%。

我們來總結start: end: step切片的簡寫方式,其中從第乙個元素讀取時start 可以省略,

即start=0 是可以省略,取到最後乙個元素時end 可以省略,步長為1 時step 可以省略

切片的方式

意義start: end:step

從 start 開始讀取到end(不包含end),步長為step

start: end

從 start 開始讀取到end(不包含end),步長為1

start:

從 start 開始讀取完後續所有元素,步長為1

start::step

從 start 開始讀取完後續所有元素,步長為step

: end:step

從 0 開始讀取到end(不包含end),步長為step

:end

從 0 開始讀取到end(不包含end),步長為1

::step

每隔 step-1 個元素取樣所有

::讀取所有元素

:讀取所有元素

特別地,step 可以為負數,考慮最特殊的一種例子,step = −1時,start: end: −1表示從start 開始,逆序讀取至end 結束(不包含end),索引號??? ≤ ?????。考慮一0~9 簡單序列,逆序取到第1 號元素,不包含第1 號:

in [59]: x = tf.range(9)

x[8:0:-1]

out[59]:

逆序取全部元素:

in [60]: x[::-1]

out[60]:

逆序間隔取樣:

in [61]: x[::-2]

out[61]:

in [62]: x = tf.random.normal([4,32,32,3])

x[0,::-2,::-2]

out[62]:

當張量的維度數量較多時,不需要取樣的維度一般用單冒號:表示取樣所有元素,此時有可能出現大量的:出現。繼續考慮[4,32,32,3]的張量,當需要讀取g 通道上的資料時,前面所有維度全部提取,此時需要寫為:

in [63]: x[:,:,:,1]

out[63]:

為了避免出現像?[: , : , : ,1]這樣出現過多冒號的情況,可以使用⋯符號表示取多個維度上所有的資料,其中維度的數量需根據規則自動推斷:當切片方式出現⋯符號時,⋯符號左邊的維度將自動對齊到最左邊,⋯符號右邊的維度將自動對齊到最右邊,此時系統再自動推斷⋯符號代表的維度數量,它的切片

** 4.2 …切片方式小結

切片的方式

意義a,⋯,b

a 維度對齊到最左邊,b 維度對齊到最右邊,中間的維度全部讀取,其他維度按a/b 的方式讀取

a,⋯ a

維度對齊到最左邊,a 維度後的所有維度全部讀取,a 維度按a 方式讀取。這種情況等同於a 索引/切片方式

⋯,bb 維度對齊到最右邊,b 之前的所有維度全部讀取,b 維度按b 方式讀取

⋯讀取張量所有資料

考慮如下例子:

in [64]: x[0:2,...,1:]

out[64]:

張量的索引與切片方式多種多樣,尤其是切片操作,初學者容易犯迷糊。但其實本質上切片操作只有?????: ???: ????這一種基本形式,通過這種基本形式有目的地省略掉預設引數,從而衍生出多種簡寫方法,這也是很好理解的。它衍生的簡寫形式熟練後一看就能推測出省略掉的資訊,書寫起來也更方便快捷。由於深度學習一般處理的維度數在4 維以內,⋯操作符完全可以用:符號代替,因此理解了這些就會發現張量切片操作並不複雜。

Tensorflow2 0張量生成

tensorflow 1 tensor就是張量,多維陣列,多維列表,階表示張量的維數 dimension 維數階 名字例子 0 d標量scalar s 1 2 3 1 d向量vector v 1,2,3 2 d矩陣matrix m 1,2,3 4,5,6 7,8,9 n dn 張量tensor t ...

tensorflow2 0 維度變換

a tf.random.normal 4,28,28,3 a 1 tf.reshape a,4,784,3 shape 1 a 1 tf.reshape a,4,1,3 shape 和1等價 a 2 tf.reshape a,4,784 3 shape 2 a 2 tf.reshape a,4,1 ...

TensorFlow2 0張量的典型應用

1.標量 標量的典型用途之一是誤差值的表示 各種測量指標的表示,比如準確度,精度和召回率等。import tensorflow as tf 隨機模擬網路輸出 out tf.random.uniform 4 10 隨即構造樣本真實標籤 y tf.constant 2 3,2 0 one hot編碼 y...