1. 程式人生 > 程式設計 >TensorFlow索引與切片的實現方法

TensorFlow索引與切片的實現方法

索引與切片在Tensorflow中使用的頻率極其高,可以用來提取部分資料。

1.索引

在 TensorFlow 中,支援基本的[𝑖][𝑗]…標準索引方式,也支援通過逗號分隔索引號的索引方式。

假設建立四張大小為3*3的彩色圖片。

# 建立張量
x = tf.random.normal([4,32,3])
# 提取出第一張圖片
x[0]

<tf.Tensor: id=253,shape=(32,3),dtype=float32,numpy=
array([[[ 3.16146165e-01,1.88969020e-02,1.38413876e-01],[ 4.89341050e-01,2.75277281e+00,7.39786148e-01],[-1.25965345e+00,-2.69633114e-01,-1.16465724e+00],...,# 提取出第一張圖片的第二行
x[0][1]

<tf.Tensor: id=261,numpy=
array([[ 7.4337220e-01,-1.0524833e+00,-2.6401659e-03],[ 5.3725803e-01,-9.5556659e-01,4.9091709e-01],[-4.6934509e-01,7.9289172e-03,-2.9179385e+00],[ 2.9324377e-01,2.1451252e+00,-3.8849866e-01],[ 8.2027388e-01,-4.9701610e-01,-7.3374517e-02],......

# 提取出第一張圖片的第二行第三列的畫素
x[0][1][2]

<tf.Tensor: id=273,shape=(3,),numpy=array([-0.4693451,0.00792892,-2.9179385 ],dtype=float32)>

# 提取出第一張圖片第二行第三列第二個用到(B通道)的顏色強度
x[0][1][2][2]

<tf.Tensor: id=289,shape=(),numpy=-2.9179385>

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

x[1,9,2] == x[1][9][2]

<tf.Tensor: id=306,dtype=bool,numpy=array([ True,True,True])>

2.切片

通過𝑠𝑡𝑎𝑟𝑡: 𝑒𝑛𝑑: 𝑠𝑡𝑒𝑝切片方式可以方便地提取一段資料,其中 start 為開始讀取位置的索引,end 為結束讀取位置的索引(不包含 end 位),step 為讀取步長。

還是以shape為[4,3]的圖片張量為例。

# 建立張量
x = tf.random.normal([4,3])
# 讀取第二張和第三張圖片
x[1:3]

<tf.Tensor: id=344,shape=(2,numpy=
array([[[[-3.4415385e-01,5.8418065e-01,1.8238322e-01],[ 5.3377771e-01,5.8201426e-01,1.2839563e+00],[-1.4592046e+00,-2.3443605e-01,-2.6524603e-01],[-5.0662726e-01,6.9743747e-01,-5.8803167e-02],[ 1.4200432e+00,-5.0182146e-01,5.1661726e-02],[ 3.5610806e-02,-2.4781477e-01,1.8222639e-01]],[[ 1.3892423e+00,1.1985755e+00,-6.4732605e-01],[ 8.5562867e-01,1.2758574e+00,1.7331127e+00],[ 9.7743452e-02,-5.3990984e-01,8.3400911e-01],

start: end: step切片方式有很多簡寫方式,其中 start、end、step 3 個引數可以根據需要選擇性地省略,全部省略時即::,表示從最開始讀取到最末尾,步長為 1,即不跳過任何元素。如 x[0,::]表示讀取第 1 張圖片的所有行,其中::表示在行維度上讀取所有行,它等於x[0]的寫法。

即x[0,::]等價於x[0 ]。

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

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

<tf.Tensor: id=344,

上述表示取所有圖片,隔行取樣,隔列取樣,採集所有通道資訊。相當於在圖片的高寬各放縮至原來的一半。

下面是一些常見的切片方式小結:

特別地,step可以為負數。例如:step = −1時,start: end: −1表示從 start 開始,逆序讀取至 end 結束(不包含 end),索引號𝑒𝑛𝑑 ≤ 𝑠𝑡𝑎𝑟𝑡。

x = tf.range(9)

# 逆序輸出
x[8:0:-1]
<tf.Tensor: id=31,shape=(8,dtype=int32,numpy=array([8,7,6,5,4,3,2,1])>

# 逆序取全部元素
x[::-1]
<tf.Tensor: id=35,shape=(9,1,0])>

# 逆序間隔取樣
x[::-2]
<tf.Tensor: id=39,shape=(5,0])>

當張量的維度數量較多時,不需要取樣的維度一般用單冒號:表示取樣所有元素。

x = tf.random.normal([4,3])
# 提取所有圖片的G通道
x[:,:,1]

<tf.Tensor: id=59,shape=(4,32),numpy=
array([[[ 0.5700944,0.58056635,2.2198782,-0.8475847,0.49761978,0.28784937],[-0.22224228,0.77950406,-0.01802959,0.55532527,0.6826188,0.50668514],[-2.4160695,-0.96219736,0.62681717,1.0348777,

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

# 建立四張大小為32*32的彩色圖片
x = tf.random.normal([4,3])
# 讀取第一張和第二張圖片的G/B通道資料
x[0:2,1:]
# 讀取最後兩張圖片
x[2,...]
# 讀取所有圖片的R/G通道
x[...,:2]

掌握了張量的索引與切片之後,會讓我們的書寫更加快捷。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。