TensorFlow 合併與分割

2021-10-01 18:15:05 字數 2033 閱讀 4536

二、分割

合併是指將多個張量在某個維度上合併為乙個張量。

以某學校班級成績冊資料為例,設張量a 儲存了某學校1-4 號班級的成績冊,每個班級35 個學生,共8 門科目,則張量a的shape 為:[4,35,8];同樣的方式,張量b 儲存了剩下的6 個班級的成績冊,shape 為[6,35,8]。通過合併2 個成績冊,便可得到學校所有班級的成績冊張量c,shape 應為[10,35,8]。

這就是張量合併的意義所在。

張量的合併可以使用拼接(concatenate)和堆疊(stack)操作實現,拼接並不會產生新的維度,而堆疊會建立新維度。選擇使用拼接還是堆疊操作來合併張量,取決於具體的場景是否需要建立新維度。

在tensorflow 中,可以通過tf.concat(tensors, axis),其中tensors 儲存了所有需要合併的張量list,axis 指定需要合併的維度。

回到上面的例子,這裡班級維度索引號為0,即axis=0,合併張量a,b 如下:

除了可以在班級維度上進行合併,還可以在其他維度上合併張量。考慮張量a 儲存了所有班級所有學生的前4 門科目成績,shape 為[10,5,4],張量b 儲存了剩下的4 門科目成績,shape 為[10,5,4],則可以合併shape 為[10,5,8]的總成績冊張量:

合併操作可以在任意的維度上進行,唯一的約束是非合併維度的長度必須一致

tf.concat 直接在現有維度上面合併資料,並不會建立新的維度。

如果在合併資料時,希望建立乙個新的維度,則需要使用tf.stack操作

考慮張量a 儲存了某個班級的成績冊,shape 為[35,8],張量b 儲存了另乙個班級的成績冊,shape 為[35,8]。合併這2 個班級的資料時,需要建立乙個新維度,定義為班級維度,新維度可以選擇放置在任意位置,一般根據大小維度的經驗法則,將較大概念的班級維度放置在學生維度之前,則合併後的張量的新shape 應為[2,35,8]。

使用tf.stack(tensors, axis)可以合併多個張量tensors,其中axis 指定插入新維度的位置,axis 的用法與tf.expand_dims的一致,當axis ≥ 0時,在axis 之前插入;當axis < 0時,在axis 之後插入新維度。例如shape 為[?, ?, ℎ, ?]的張量,在不同位置通過stack 操作插入新維度,axis 引數對應的插入位置設定如圖

合併操作的逆過程就是分割,將乙個張量分拆為多個張量。

繼續考慮成績冊的例子,我們得到整個學校的成績冊張量,shape 為[10,35,8],現在需要將資料在班級維度切割為10 個張量,每個張量儲存了對應班級的成績冊。

通過tf.split(x, axis, num_or_size_splits)可以完成張量的分割操作,其中

x:待分割張量

axis:分割的維度索引號

num_or_size_splits:切割方案。當num_or_size_splits 為單個數值時,如10,表示切割為10 份;當num_or_size_splits 為list 時,每個元素表示每份的長度,如[2,4,2,2]表示切割為4 份,每份的長度分別為2,4,2,2

還可以進行不定長切割比如這裡將 x 切割為 2 份,每份長度為[1,2]

UNIX合併與分割

sort用法 sort命令將許多不同的域按不同的列順序分類.命令格式 sort cmu o output file other options pos1 pos2 input files sort選項 c 測試檔案是否分類 m 合併兩個分類檔案 u 刪除所有複製行 o 儲存sort結果的輸出檔名 b...

7 合併與分割

1 concat,拼接 例 統計班級的學生的分數 a class1 4,student,scores 4個班級,35個學生,8門課的分數 b class5 6,student,scores 2個班級,35個學生,8門課的分數 cancat要求除了指定合併的維度之外,其餘的維度要大小要相同 1 a t...

檔案的合併與分割

檔案的合併與分割其實比較簡單,分割時將乙個大檔案按二進位制方式讀取,然後按二進位制寫成乙個個小檔案。合併時就把小檔案順次讀取,再寫入乙個大檔案。下面是乙個簡單的例子 檔案分割,二進位制讀取 void cmyupdatedlg onbinary byte buf 140000 緩衝區 dword dw...