一、tf.stack() 矩陣拼接函數,即將秩爲 R 的張量列表堆疊成一個秩爲 (R+1) 的張量。
axis=0在橫軸上進行合併,axis=1 代表在縱軸上進行合併
將 values 中的張量列表打包成一個張量,該張量比 values 中的每個張量都高一個秩,通過沿 axis 維度打包。給定一個形狀爲(A, B, C)的張量的長度 N 的列表;
- 如果 axis == 0,那麼 output 張量將具有形狀(N, A, B, C)。
- 如果 axis == 1,那麼 output 張量將具有形狀(A, N, B, C)。
- 如果 axis == 2,那麼 output 張量將具有形狀( A, B, N, C)。
- 如果 axis == 3,那麼 output 張量將具有形狀(A, B, C, N)。
import sys
import os
import json
import numpy as np
import tensorflow as tf
t1 = tf.constant([[1, 2, 3], [4, 5, 6]])
t2 = tf.constant([[7, 8, 9], [10, 11, 12]])
a= tf.stack([t1, t2],axis=0)
a= tf.stack([t1, t2],axis=1)
with tf.Session() as sess:
print(sess.run(a))
print(sess.run(b))
==================================================
a:
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
b:
[[[ 1 2 3]
[ 7 8 9]]
[[ 4 5 6]
[10 11 12]]]
二、tf.unstack() 是一個拆分矩陣的函數,將秩爲 R 的張量的給定維度出棧爲秩爲 (R-1) 的張量。
通過沿 axis 維度將 num 張量從 value 中分離出來。如果沒有指定 num(默認值),則從 value 的形狀推斷。如果 value.shape[axis] 不知道,則引發 ValueError。
例如,給定一個具有形狀 (A, B, C, D) 的張量。
- 如果 axis == 0,那麼 output 中的第 i 個張量就是切片 value[i, :, :, :],並且 output 中的每個張量都具有形狀 (B, C, D)。(請注意,出棧的維度已經消失,不像split)。
- 如果 axis == 1,那麼 output 中的第 i 個張量就是切片 value[:, i, :, :],並且 output 中的每個張量都具有形狀 (A, C, D)。
這與堆棧(stack.)相反
三、tf.split() 與 tf.stack()
import tensorflow as tf
A = [[1, 2, 3], [4, 5, 6]]
a0 = tf.split(A, num_or_size_splits=3, axis=1)#不改變維數(!!)
a1 = tf.unstack(A, num=3,axis=1)
a2 = tf.split(A, num_or_size_splits=2, axis=0)
a3 = tf.unstack(A, num=2,axis=0)
with tf.Session() as sess:
print(sess.run(a0))
print(sess.run(a1))
print(sess.run(a2))
print(sess.run(a3))
--------------------------------------------------
輸出:
a0: [array([[1],[4]]), array([[2],[5]]), array([[3],[6]])]
a1: [array([1, 4]), array([2, 5]), array([3, 6])]
a2: [array([[1, 2, 3]]), array([[4, 5, 6]])]
a3: [array([1, 2, 3]), array([4, 5, 6])]
四、tf.pad
tf.pad(tensor, paddings, mode="CONSTANT", name=None, constant_values=0):
tensor:就是輸入,paddings,就是需要擴張的維度,後面其他的參數的可以不管
tf.pad()就是擴充維度,比如
t=tf.constant([1,2,3])
paddings=[a,b,c,d],分別從不同維度加0,因爲是一維向量,所以tf.pad(t,[[1,1]])只能從左右加0輸出結果爲[[0 1 2 3 0]],
當t=tf.constant([[1,2,3]])時,則是一個二維矩陣,就加了一個[],shape=(1,3)
[ [0 0 0 0 0 0 0]
[0 0 1 2 3 0 0]
[0 0 0 0 0 0 0] ]
如果a=[1,1],b=[2,2],則上下加一排0,左右加2排0,結果爲
在二維上面加0,當c=[1,1],t=tf.constant( [[[1,2,3], [2,3,4],[2,1,4]],
[[1,2,3], [2,3,4],[2,1,4]],
[[1,2,3], [2,3,4],[2,1,4]]])
時,即paddings=[[1,1],[2,2],[1,1]]輸出爲下面所示,shape=(3,3,3)變成了(5,7,5)