日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【TensorFlow2.0】(3) 索引与切片操作

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【TensorFlow2.0】(3) 索引与切片操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

各位同學好,今天我和大家分享一下TensorFlow2.0中索引與切片。內容有:

(1) 給定每一維度的索引來獲取數據;(2) 切片索引;(3) 省略號應用;(4) tf.gather() 方法;(5) tf.gather_nd() 方法;(6) 布爾索引選數據

那我們開始吧。


1. 給定每一維度的索引獲取數據

1.1 變量[ ][ ] 方法

首先定義一個全為1的四維tensor,如:tf.ones([2,3,3,2])。由于整個數據龐大,不利于觀察,我們使用.shape來觀察取出數據的情況。

#創建一個全為1的四維tensor,默認float32
a = tf.ones([2,3,3,2])
# 返回3,3,2的tensor  
a[0].shape  
#取出3行2列的矩陣tensor
a[0][0].shape  
#返回長度為2列表tensor
a[0][0][0].shape 
#值為標量1,是0維tensor.
a[0][0][0][1].shape  

我們可以把這個四維tensor,[2,3,3,2],理解為,有2個班級,每個班級有3名同學,每名同學有3門科目,每門科目有2份作業。

a[0]?可以理解為,第0個班級的所有數據,它包含3名同學,每名有3門科目,每科目有2份作業。因此,a[0] 是一個三維tensor形狀為[3,3,2]

a[0][0]?可以理解為,第0個班級的第0個同學的所有數據,它包含3門科目,每科目有2份作業。因此,a[0][0]?是一個二維tensor形狀為[3,2]

同理其他兩個


1.2 變量[ , ] 方法

我們創建一個四維隨即正態分布的tensor,形狀shape為[4,5,6,7],我們同樣可以用上一個理解方法來看這個四維tensor。4個班級,每班5個人,每人6門課,每門課7份作業。

#創建一個四維隨機正態分布tensor
a = tf.random.normal([4,5,6,7])  
# 
a[1].shape  # 返回[5,6,7]
# 
a[1,2].shape  # 返回[6,7]
#
a[1,2,3].shape  # 返回[7]
# 
a[1,2,3,4]  # 返回值

a[1,2] 代表第1個班級中,第2名學生的所有信息,包含6門功課,每門課7份作業。因此,a[1,2].shape是一個二維tensor,形狀為[6,7]該方法a[1,2]等同于上述的a[1][2]。可以少寫括號且更直觀。

a[1,2,3,4] 代表第1個班級中的第2名學生的第3門功課的第4份作業的信息,返回一個值。


2. 切片索引

2.1 變量[start : end]

使用位置索引切片,顧頭不顧尾

# ==1== 方法一#從0-9的10個元素組成的tensor
a = tf.range(10)
# 獲取3、4、5
a[3:6]
# 獲取前3個,0、1、2
a[:3] 
# 獲取倒數第4個到倒數第2個,-1代表最后一個
a[-4:-1] 


2.2 多個冒號,變量[A , : , : , B]

首先創建一個四維的tensor,shape為[4,5,6,7]。可以理解為,有4幅圖像,每幅圖像有5行,每一行包含6列,每一列有7個數據。

# ==2== 方法二
#創建4維tensor
b = tf.ones([4,5,6,7]) 
# 第0張圖像有5行,每行有6列,每列有7個數
b[0].shape  
# 取第0張圖片的所有數據
b[0,:,:,:].shape 
# 變成單通道,前3個維度全部獲取,第四個維度取第2個
b[:,:,:,2].shape  
# 4張圖像都取第2行,每行的所有列,每列的所有值,shape[4,6,7]
b[:,2,:,:].shape   

b[0] 和 b[0,:,:,:] 代表相同意思,都是取第0張圖像的全部數據,返回的shape都是[5,6,7],即第0張圖像有5行,每行有6列,每列有7個數值。

b[:,2,:,:] 代表所有圖像的第2行數據,包含4張圖像,每張圖像有6列,每列有7個數值。因此,shape為[4,6,7]


2.3 指定步長,隔行采樣,變量[start : end?: step]

正序,定義的四維tensor,shape為[5,6,7,8],可以按上述方法理解它。

# 定義四維且值全為1的tensor
c = tf.ones([5,6,7,8]) 
# 第1、3張圖像的所有數據
c[1:5:2,:,:,:].shape  
# 5張圖片圖片的第1、3行,0、2列的所有數據
c[:,1:5:2,:4:2,:].shape   

c[ 1:5:2 , : , : , : ]?代表第1、3張圖像的全部信息,因為1到5張圖像,步長為2,顧頭不顧尾。因此shape為 [2,6,7,8]

c[:,1:5:2,:4:2,:] 代表所有5張圖像,取1、3行信息,和取0、2列信息中的所有數據。因此shape為 [5,2,2,8]

步長為負數時,要求A靠近原數據尾端,B是前端

逆序排序方法: 變量 [A : B : -1]

# ==4== 逆序排序
#創建0-4的tensor
d = tf.range(5)  
# 給d逆序排序
d[::-1] 
# 倒序:4、2、0
d[4::-2] 


3. 省略號 '...' 方法

相比于 變量[ A , : , : ,?: , B]變量 [ A , ... , B ] 中,省略號自動計算A和B之間有幾個':',寫起來更方便。

首先創建一個五維tensor,形狀shape為[3,10,12,14,8],其中 a[0]a[0 , : , : , : , : ] a[0 , ...] 代表的意思相同,都是指第一張圖像的全部數據。shape為[10,12,14,8]

a[0 , ... , 4 , :] 中的省略號代表第3、4維度的全部數據,shape為[10,12,8]

# 創建一個五維tensor
a = tf.random.normal([3,10,12,14,8]) 
# 第0張圖像的所有數據
a[0].shape  
a[0,:,:,:,:].shape  # 和上式相同  
a[0,...].shape  # 省略號代表后面的冒號
# 省略號代表中間兩維
a[0,...,4,:].shape  


4. tf.gather()函數

指定某一個維度,按照指定索引獲取數據

tf.gather(tensor, axis, indices=[ ])

value:代表tensor數據

axis: 代表取哪個維度

indices: 數據收集順序,指定維度的具體索引

4.1 使用一次 tf.gather()

創建一個三維的data全由0構成,shape為[4,35,8],可以理解為4個班級,每個班級35個人,每個人有8門功課。指定一個維度,獲得該維度下其他維度的部分數據

# 假設data三維[班級,學生,科目]
data = tf.zeros([4,35,8])
# indices指定收集順序,查第2、3個班級的所有數據
tf.gather(data,axis=0,indices=[2,3]).shape
# 指定維度1即學生,收集索引號維30、5、18、2這四個學生的數據
tf.gather(data,axis=1,indices=[30,5,18,2]).shape

axis用來指定維度,axis=0代表班級維度,axis=1代表學生,axis=2代表功課

先指定維度0代表班級維度,獲取第2、3個班級的全部數據,返回shape為[2,35,8]。班級維度變成了2個,而而每個班級仍包含35名學生,每名學生,仍有8門課。

若指定維度1代表學生維度,挑選第30、5、18、2這四名同學。這4個班都挑選需要為這四個數的四名學生,獲取他們的全部數據,因此,班級維度沒有改變,還是4,學生維度指定了只有4個,功課維度沒變,仍有8個,最后shape為[4,4,8]


4.2 連續使用幾次 tf.gather()

上面是獲取指定維度指定索引的全部數據。如果我想獲取指定維度指定索引的指定數據怎么辦呢。

我們連續使用兩次tf.gather()來抽查,所有班級某幾位同學的某幾門課的成績

# 獲得四個班級指定三名學生的指定的三門課信息
data = tf.zeros([4,35,8])
a1 = tf.gather(data,axis=1,indices=[30,5,18,2])  #獲取4名學生的全部信息
a2 = tf.gather(a1,axis=2,indices=[6,1,4]).shape  #axis=2指定科目,獲取6,1,4科目信息

獲得四個班級,每個班的30、5、18、2這個四名同學的6、1、4這3門功課的信息,因此結果shape為[4,4,3]


5. tf.gather_nd() 函數

tf.gather_nd(tensor, indices)

按照 indices 的格式從傳入的tensor中抽取切片(合并為一個Tensor)indices是一個K維整數Tensor

首先創建一個三維且值全為0的tensor,可按上述方法理解這三維。

# 指定2個維度,取第三個維度的所有值
data = tf.zeros([4,35,8])
# 獲取第[[0]]個班級所有數據,返回值減少一維度
a1 = tf.gather_nd(data,[0]).shape  
# 取0號班級第1個學生的數據,返回值少兩個維度
a2 = tf.gather_nd(data,[0,1]).shape
# 取0號班級第1個學生的第2門課的數據,返回值少三個維度
a3 = tf.gather_nd(data,[0,1,2]).shape

tf.gather_nd(data,[0,1,2]) 代表從data中獲取第0個班級的第1個學生的第2門課的數據,是一個值,因此返回的shape為 []

注意參數indices的括號使用方法,如a5,首先獲取第0個班級的第1個學生的功課數據(一維),第1個班級第5個學生的功課數據(一維),2個列表組合放到一個列表里,組成二維列表,再在外面加一個中括號,生成三維,理解為這是第1次抽取結果,因此返回的shape為[1,2,8]

再如a6,獲取的是指定班級指定學生的功課信息,[0,4]指第0個班級第4位同學的所有功課數據,返回一個列表(一維),由8門功課組成。三個一維列表外面加一個中括號,構成二維列表。shape維[3,8]。指有3位同學,每位同學有8門課。

# 取第0個班級的第1名學生的第2門課成績,和第1個班級的第5名學生的第7門課成績,放在一個列表中
a4 = tf.gather_nd(data,[[0,1,2],[1,5,7]]).shape
# 取第0個班級的第1名學生的所有課成績,和第1個班級的第5名學生的所有課成績
a5 = tf.gather_nd(data,[[[0,1],[1,5]]]).shape 
# 將二維的成績信息放在一個三維tensor中,
# 第一維表示第一次記錄,第二維表示哪些學生,第三維表示每個學生的所有科目
a6 = tf.gather_nd(data,[[0,4],[1,7],[3,5]]).shape
# 第0個班級的第4個學生的所有科目,第1個班級第7個學生所有科目。。。組合成一個二維tensor


6. 布爾索引選數據

tf.boolean_mask(tensor, mask=布爾標記, axis=指定維度)

mask的shape要和指定維度的tensor的shape相同。輸出mask標記維True的值。

# 選擇輸出mask為True的值
a = tf.ones([3,35,5,10]) # 3個班級35名學生5門課各有10份作業
# 對第0維的3個班級生成mask,即值要第0、1個班級的數據
tf.boolean_mask(a,mask=[True,True,False]).shape  #默認axis=0,即第一個維度
# 對第2維的課目生成mark,要第2、3門課的所有信息
tf.boolean_mask(a,mask=[False,False,True,True,False],axis=2).shape

tf.boolean_mask(a,mask=[True,True,False]).shape 對班級維度的三個班級進行選擇,第0、1個班級為True,第2個班級為False,因此輸出第0、1個班級的全部信息,即shape為[2,35,5,10]

生成一個三維的值全為1的tensor,沒有指定axis,可看出是對班級維度和學生維度的篩選。輸出結果的第一行是第0個班級第0個學生的4項信息,結果的第二三行是第1個班級第1、2個學生的四項信息。

b = tf.ones([2,3,4])
# mask對應b的前兩維度,第0維度取第0列的所有數據,第維度取第1、2列的所有數據
tf.boolean_mask(b,mask=[[True,False,False],[False,True,True]])

總結

以上是生活随笔為你收集整理的【TensorFlow2.0】(3) 索引与切片操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。