深度学习(12)TensorFlow高阶操作一: 合并与分割
Merge and split
- tf.concat(拼接)
- tf.split(分割)
- tf.stack(堆叠)
- tf.unstack(分割,为split中的一种)
1. concat
- Statistics about scores
-
[
c
l
a
s
s
1
?
4
,
s
t
u
d
e
n
t
s
,
s
c
o
r
e
s
]
[class1-4,students,scores]
[class1?4,students,scores]
-
[
c
l
a
s
s
5
?
6
,
s
t
u
d
e
n
t
s
,
s
c
o
r
e
s
]
[class5-6,students,scores]
[class5?6,students,scores]
(1) c = tf.concat([a, b], axis=0)1 : 将a和b合并为c,合并第1个维度(axis=0),c.shape=[6, 35, 8]; (2) tf. concat([a, b], axis=1) : 合并a和b的第2个维度(axis=1),其shape=[4, 35, 8];
- Along distinct dim/axis
- axis = 0;
shape=[12, 4];
- axis=0:
shape=[4, 7]; 注: 合并操作不会增加维度,合并之前是2维的Tensor,那么合并之后还是2维的Tensor。如果想要创造新的维度,我们就需要stack操作了;
2. stack: create new dim
- Statistics about scores
- School1:
[
c
l
a
s
s
e
s
,
s
t
u
d
e
n
t
s
,
s
c
o
r
e
s
]
[classes,students,scores]
[classes,students,scores]
- School2:
[
c
l
a
s
s
e
s
,
s
t
u
d
e
n
t
s
,
s
c
o
r
e
s
]
[classes,students,scores]
[classes,students,scores]
→
\to
→ -
[
s
c
h
o
o
l
s
,
c
l
a
s
s
e
s
,
s
t
u
d
e
n
t
s
,
s
c
o
r
e
s
]
[schools,classes,students,scores]
[schools,classes,students,scores]
(1) tf.concat([a, b], axis=-1 ): 合并a和b的倒数第1个维度(axis=-1),其shape=[4, 35, 16]; (2) tf.stack([a, b], axis=0) : 在第1个维度(axis=0)处创造一个新的维度,创建后其shape=[2, 4, 35, 8]; (3) tf.stack([a, b], axis=3) : 在第4个维度(axis=3)处创造一个新的维度,创建后其shape=[4, 35, 8, 2];
3. Dim mismatch
- concat要求除了合并的那个维度外,其它维度的数值必须相等;
- stack要求所有维度的数值必须相等;
4. unstuck
(1) c = tf.stack([a, b]) : 将a和b通过stack()函数合并为c,合并完c.shape=[2, 4, 35, 8]; (2) aa, bb = unstack(c, axis=0) : 将c从第1个维度(axis=0)处拆解为aa和bb,拆解完aa.shape=[4, 35, 8]; bb.shape=[4, 35 ,8]; (3) res = tf.unstack(c, axis=3) : 将c从第4个维度(axis=3)处拆解,第4个维度消失,拆解后共有8个res,每个res.shape=[2, 4, 35],所以res[0].shape=[2, 4, 35]; res[7].shape=[2, 4, 35];
- 如果我们不希望将c拆解为这么多个res,比如只拆解为2个res,那么我们就需要使用一个临摹性更强的API——split。
5. split
- VS unstack
(1) res = tf.split(c, axis=3, num_or_size_splits=2) : 将c从第4个维度(axis=3)处均分为2个res,每个res.shape=[2, 4, 35, 4] ; (2) res = tf.split(c, axis=3, num_or_size_splits=[2, 2, 4]) : 将c从第4个维度(axis=3)处均分为3个res,将8按照[2, 2, 4]分为3份,其中res[0].shape=[2, 4, 35, 2] ; res[1].shape=[2, 4, 35, 2] ; res[2].shape=[2, 4, 35, 4] 。
参考文献: [1] 龙良曲:《深度学习与TensorFlow2入门实战》
|