一、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)