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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习(7)TensorFlow基础操作三: 索引与切片

發布時間:2023/12/15 pytorch 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习(7)TensorFlow基础操作三: 索引与切片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度學習(7)TensorFlow基礎操作三: 索引與切片

  • 一. 基礎索引
    • 1. Basic indexing
    • 2. Numpy-style indexing
    • 3. start : end
    • 4. 切片索引(1)Indexing by “ : ”
    • 5. 切片索引(2)Indexing by “ : : ”
    • 6. 切片索引(3)Indexing by “ : : -1”
    • 7. 切片索引(4)Indexing by “ … ”
  • 二. 選擇性索引
    • 1. tf.gather
    • 2. tf.gather_nd
    • 3. tf.boolean_mask

一. 基礎索引

Indexing

  • Basic indexing
    • [idx][idx][idx]
  • Same with Numpy
  • [idx, idx, …]
  • start : end
  • start : end : step

1. Basic indexing

(1) a = tf.ones([1, 5, 5, 3]): 創建一個元素值全為1的4維Tensor,可以這樣理解: 共有1個任務,每個任務重有5個矩陣,每個矩陣的維度為5行3列;
(2) a[0][0]: 取出a中第1個任務中的第1個矩陣,即:
(111111111111111)\begin{pmatrix}1&1&1\\1&1&1\\1&1&1\\1&1&1\\1&1&1 \end{pmatrix}???????11111?11111?11111????????
所以,這個a[0][0]的shape=(5, 3);
(3) a[0][0][0]: 取出a中第1個任務中的第1個矩陣中的第1行,即:
[111]\begin{bmatrix}1&1&1 \end{bmatrix}[1?1?1?]
所以,這個a[0][0][0]的shape=(3,);
(4) a[0][0][0][2]: 取出a中第1個任務中的第1個矩陣中的第1行中的第3個元素,即:
111
所以,這個a[0][0][0][2]的shape=();

  • 缺點: 讀取不靈活。

2. Numpy-style indexing

(1) a = tf.random.normal([4, 28, 28, 3]): 創建一個4維Tensor,可以這樣理解: 一個batch里共有4張圖片,每張圖片為28×28,圖片為彩色圖片,所以通道數為3;
(2) a[1].shape: 這個batch中的第2張照片的shape為[28, 28, 3];
(3) a[1, 2].shape: 這個batch中的第2張照片的第3行有3個RGB的數值,其shape為[28, 3];
(4) a[1, 2, 3].shape: 這個batch中的第2張照片的第3行第4列有1個RGB數值,其shape為[3];
(5) a[1, 2, 3, 2].shape: 這個batch中的第2張照片的第3行第4列RGB數值中的B通道,也就是藍色,其shape為[];

3. start : end

(1) a = tf.range(10): 創建一個0~9的Tensor;
(2) a[x: y]: 取出a中從x開始到y(不包括y)的所有元素;
(3) a[-1:]: 取出a中從倒數第1個元素到最后1個元素,就是最后一個元素它自己,即[9];
(4) a[-2:]: 取出a中從倒數第2個元素到最后1個元素,即[8, 9];
(5) a[:2]: 取出a中從第1個元素到第3個元素(不包括第3個元素),即[0, 1];
(6) a[:-1]: 取出a中從第1個元素到倒數第1個元素(不包括最后1個元素),即[0, 1, 2, 3, 4, 5, 6, 7, 8];

4. 切片索引(1)Indexing by “ : ”

(1) a[0, : , : , :].shape: 取出第1張照片中的所有數據,就是[28, 28, 3];
(2) a[0, : , : , :].shape: 取出第1張照片中的所有數據,就是[28, 28, 3];
(3) a[0, 1, : , :].shape: 取出第1張照片中的第2行的所有數據,就是[28, 3];
(4) a[: , : , : , 0].shape: 取出R(紅色)通道的所有4張照片中的數據,就是[4, 28, 28];
(5) a[: , : , : , 2].shape: 取出B(藍色)通道的所有4張照片中的數據,就是[4, 28, 28];
(6) a[: , 0, : , :].shape: 取出所有照片中的第2行的所有數據,就是[4, 28, 3];

5. 切片索引(2)Indexing by “ : : ”

  • start🔚step
  • ::step

(1) a[0:2, : , : , :]: 第1到第3張(不包括第三張)圖片的所有數據shape為[2, 28, 28, 3];
(2) a[: , 0:28:2 , 0:28:2 , :]: 所有4張圖片取第1行到第27行(不包括第27行)隔位取數,其shape為[4, 14, 14, 3];
(3) a[: , :14 , :14 , :]: 所有4張圖片取第1行到第14行(不包括第14行),其shape為[4, 14, 14, 3];
(4) a[: , 14: , 14: , :]: 所有4張圖片取第14行到最后1行(不包括最后1行),其shape為[4, 14, 14, 3];
(5) a[: , : : 2 , : : 2 , :]: 所有4張圖片取第1行到最后1行,隔位取數,其shape為[4, 14, 14, 3];

6. 切片索引(3)Indexing by “ : : -1”

(1) a[: : -1]: 取出a中從倒數第1個元素到第1個元素,即[3, 2, 1, 0];
(2) a[: : -2]: 取出a中從倒數第1個元素到第1個元素,隔位取數,即[3, 1];
(3) a[2 : : -2]: 取出a中從第3個元素到第1個元素,隔位取數,即[2, 0];

7. 切片索引(4)Indexing by “ … ”

(1) a[0, …]: 作用與a[0, : , : , : , :]一樣,其shape為[4, 28, 28, 3];
(2) a[…, 0]: 作用與a[: , : , : , : ,0]一樣,其shape為[2, 4, 28, 28];
(3) a[0, … ,2]: 作用與a[0 , : , : , : ,2]一樣,其shape為[4, 28, 28];
(4) a[1, 0, … , 0]: 作用與a[1 , 0 , : , : ,0]一樣,其shape為[28, 28];

二. 選擇性索引

Selective Indexing

  • tf.gather
  • tf.gather_nd
  • tf.boolean_mask

1. tf.gather

  • data: [classes, students, subjects]
    • [4, 35, 8]

設一共有4個班級,每個班級有35個學生,每個學生需要學習8門課程;

(1) tf.gather(a, axis=0, indices=[2, 3]): 其中a為數據源; axis=0代表我們要取第1個維度,也就是班級; indices=[2, 3]代表我們要取的班級為第3個班級和第4個班級; 所以其shape就為[2, 35, 8],這個索引和之前的a[2 : 4]的效果是一樣的;
(2) tf.gather(a, axis=0, indices=[2, 1, 3, 0]): indices=[2, 1, 3, 0]表示我們收集數據的順序,先收集第3個班級,再收集第2個班級,再收集第4個班級,最后收集第1個班級,所以shape=[4, 35, 8],雖然shape相同,但是收集數據的順序改變了,這也能看出tf.gather()的功能面更廣;
(3) tf.gather(a, axis=1, indices=[2, 3, 7, 9, 16]): 收集a數據集中每個班級中的第3,第4,第8,第10和第17名同學的數據,其shape=[4, 5, 8];
(4) tf.gather(a, axis=2, indices=[2, 3, 7]): 收集a數據集中每個班級每名同學的第3,第4和第7門課程的數據,其shape=[4, 35, 3];

2. tf.gather_nd

  • data: [classes, students, subjects]
  • 如果需要采樣多個學生和他們的幾門課程應該怎么辦呢?
    • aa = tf.gather(a, axis, [several students])
    • aaa = tf.gather(aa, axis, [several students])

很顯然,如果數據過多的話,這樣就太麻煩了;
tf.gather_nd:

  • [class1_student1, class2_student2, class3_student3, class4_student4]
  • →\to [4, 8](共有4個學生,每個學生有8門課程)

(1) tf.gather_nd(a, [0]): 這里的[0]可以理解為[[0], [], []],指定了班級為第1個班級,所以其shape=[35, 8];
(2) tf.gather_nd(a, [0, 1]): 這里的[0, 1]可以理解為[[0], [1], []],指定了班級為第1個班級的第2個學生,所以其shape=[8];
(3) tf.gather_nd(a, [0, 1, 2]): 這里的[0, 1, 2]可以理解為[[0], [1], [2]],指定了班級為第1個班級的第2個學生的第3門課程,所以其shape=[];

  • 理解: 把最內層的[]看成是一個聯合索引的坐標,例如[0]理解為a[0],所以其shape=[35, 8]; [0, 1]理解為a[0, 1],其shape=[8]; [0, 1, 2]理解為a[0, 1, 2],其shape=[];

(4) tf.gather_nd(a, [[0, 1, 2]]): 由上面的理解可知,這里的[0, 1, 2]是一個標量(Scalar),[[0, 1, 2]]就為[[Scalar]],所以其shape=[1];

(5) tf.gather_nd(a, [[0, 0], [1, 1]]): 其中[0, 0]表示取第1個班級的第1個學生的數據的8維Vector(向量); [1, 1]表示取第2個班級的第2個學生的數據的8維Vector; 就是2個8維的Vector拼接在一起,所以其shape=[2, 8];
(6) tf.gather_nd(a, [[0, 0], [1, 1], [2, 2]]): 其中[0, 0]表示取第1個班級的第1個學生的數據的8維Vector(向量); [1, 1]表示取第2個班級的第2個學生的數據的8維Vector; [2, 2]表示取第3個班級的第3個學生的數據的8維Vector; 就是3個8維的Vector拼接在一起,所以其shape=[3, 8];
(7) tf.gather_nd(a, [[0, 0, 0], [1, 1, 1], [2, 2, 2]]): 其中[0, 0, 0]表示取第1個班級的第1個學生的第1門課程的數據的Scalar(標量); [1, 1, 1]表示取第2個班級的第2個學生的第2門課程的數據的Scalar; [2, 2, 2]表示取第3個班級的第3個學生的第3門課程的數據的Scalar; 就是3個Scalar拼接在一起,所以其shape=[3];
(8) tf.gather_nd(a, [[[0, 0, 0], [1, 1, 1], [2, 2, 2]]]): 其中[0, 0, 0]表示取第1個班級的第1個學生的第1門課程的數據的Scalar(標量); [1, 1, 1]表示取第2個班級的第2個學生的第2門課程的數據的Scalar; [2, 2, 2]表示取第3個班級的第3個學生的第3門課程的數據的Scalar; 就是[[[Scalar], [Scalar], [Scalar]]],就是1行3列,所以其shape=[1, 3],例如以上3名同學的成績分別為98,42,100,那么這組數據就為[[98, 42, 100]],是一個1行3列的數據;

  • tf.gather_nd建議的格式:
    • [[0], [1], …]
    • [[0, 0], [1, 1], …]
    • [[0, 0, 0], [1, 1, 1], …]
    • 注: 不建議3層括號。

3. tf.boolean_mask

(1) tf.boolean_mask(a, mask=[True, True, False, False]): 表示4張圖片取第1張和第2張圖片的數據,所以shape=[2, 28, 28, 3];
(2) tf.boolean_mask(a, mask=[True, True, False], axis=3): 指定了axis=3代表從通道數取值,取四張圖片的R(紅色)和G(綠色)通道的數據,所以shape=[4, 28, 28, 2];

  • 注: mask中的元素個數必須要對應所取維度(axis)中的元素個數;

(3) tf.boolean_mask(a, mask=[[True, False, False], [False, True, True]]): 首先理解mask=[[a], [b]],a和b分別對應a=tf.ones([2, 3, 4])中的2和3所對應的維度,也就是說mask可以理解為對應如下的矩陣:
(TrueFalseFalseFalseTrueTrue)\begin{pmatrix}True&False&False\\False&True&True \end{pmatrix}(TrueFalse?FalseTrue?FalseTrue?)
從矩陣中可以看到,共有3個值為“True”的元素,也就是共有3個4維的[1],所以shape=[3, 4]。

參考文獻:
[1] 龍良曲:《深度學習與TensorFlow2入門實戰》
[2] http://www.duesudue.it/eng/dettaglio_servizi.html?ID=3

總結

以上是生活随笔為你收集整理的深度学习(7)TensorFlow基础操作三: 索引与切片的全部內容,希望文章能夠幫你解決所遇到的問題。

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