1. 程式人生 > >Tensorflow stack 與 unstack 詳細介紹

Tensorflow stack 與 unstack 詳細介紹

tf.stack() tf.stack(values, axis=0, name=’stack’) 以指定的軸axis,將一個維度為R的張量陣列轉變成一個維度為R+1的張量。即將一組張量以指定的軸,提高一個維度。

假設要轉變的張量陣列values的長度為N,其中的每個張量的形狀為(A, B, C)。 如果軸axis=0,則轉變後的張量的形狀為(N, A, B, C)。 如果軸axis=1,則轉變後的張量的形狀為(A, N, B, C)。 如果軸axis=2,則轉變後的張量的形狀為(A, B, N, C)。其它情況依次類推。

舉例如下: ‘x’ is [1, 4], 形狀是(2),維度為1 ‘y’ is [2, 5], 形狀是(2),維度為1 ‘z’ is [3, 6], 形狀是(2),維度為1 stack([x, y, z]) => [[1, 4], [2, 5], [3, 6]] # axis的值預設為0。輸出的形狀為(3, 2) stack([x, y, z], axis=1) => [[1, 2, 3], [4, 5, 6]] # axis的值為1。輸出的形狀為(2, 3)

‘x’ is [[1,1,1,1],[2,2,2,2],[3,3,3,3]],形狀是(3,4),維度為2 ‘y’ is [[4,4,4,4],[5,5,5,5],[6,6,6,6]],形狀是(3,4),維度為2 stack([x,y]) => [[[1,1,1,1],[2,2,2,2],[3,3,3,3]], [[4,4,4,4],[5,5,5,5],[6,6,6,6]]] # axis的值預設為0。輸出的形狀為(2, 3, 4) stack([x,y],axis=1) => [[[1,1,1,1],[4,4,4,4]],[[2,2,2,2],[5,5,5,5]],[[3,3,3,3],[6,6,6,6]]] # axis的值為1。輸出的形狀為(3, 2, 4) stack([x,y],axis=2) => [[[1,4],[1,4],[1,4],[1,4]],[[2,5],[2,5],[2,5],[2,5]],[[3,6],[3,6],[3,6],[3,6]]]# axis的值為2。輸出的形狀為(3, 4, 2)

axis可這樣理解:stack就是要將一組相同形狀的張量提高一個維度。axis就是這些張量裡,將axis指定的維度用所有這些張量陣列代替。如axis=2,表示指定在第2個維度,原來的元素用整個張量數組裡的元素代替,即從(A, B, C)轉變為(A, B, N, C)

引數: values: 一個有相同形狀與資料型別的張量陣列。 axis: 以軸axis為中心來轉變的整數。預設是第一個維度即axis=0。支援負數。取值範圍為[-(R+1), R+1) name: 這個操作的名字(可選) 返回:被提高一個維度後的張量 異常: ValueError: 如果軸axis超出範圍[-(R+1), R+1).

tf.unstack() tf.unstack(value, num=None, axis=0, name=’unstack’) 以指定的軸axis,將一個維度為R的張量陣列轉變成一個維度為R-1的張量。即將一組張量以指定的軸,減少一個維度。正好和stack()相反。

將張量value分割成num個張量陣列。如果num沒有指定,則是根據張量value的形狀來指定。如果value.shape[axis]不存在,則丟擲ValueError的異常。

假如一個張量的形狀是(A, B, C, D)。 如果axis == 0,則輸出的張量是value[i, :, :, :],i取值為[0,A),每個輸出的張量的形狀為(B,C,D)。 如果axis == 1,則輸出的張量是value[:, i, :, :],i取值為[0,B),每個輸出的張量的形狀為(A,C,D)。 如果axis == 2,則輸出的張量是value[:, :, i, :],i取值為[0,C),每個輸出的張量的形狀為(A,B,D)。依次類推。

舉例如下: ‘x’ is [[1,1,1,1],[2,2,2,2],[3,3,3,3]] # 形狀是(3,4),維度為2 unstack(x,axis=0) =>以指定的維度0為軸,轉變成3個形狀為(4)張量[1,1,1,1],[2,2,2,2],[3,3,3,3] unstack(x,axis=1) =>以指定的維度1為軸,轉變成4個形狀為(3)張量[1,2,3],[1,2,3],[1,2,4],[1,2,3]

axis可這樣理解:unstack就是要將一個張量降低為低一個維度的張量陣列。axis就是將axis指定的維度,用所有這個張量裡同維度的資料代替。

引數: value: 一個將要被降維的維度大於0的張量。 num: 整數。指定的維度axis的長度。如果設定為None(預設值),將自動求值。 axis: 整數.以軸axis指定的維度來轉變 預設是第一個維度即axis=0。支援負數。取值範圍為[-R, R) name: 這個操作的名字(可選) 返回: 從張量value降維後的張量陣列。 異常: ValueError: 如果num沒有指定並且無法求出來。 ValueError: 如果axis超出範圍 [-R, R)。