演示代码:
a = tf.constant([[1,2,3],[4,5,6]])
b = tf.constant([[7,8,9],[10,11,12]])
ab1 = tf.concat([a,b],axis=0)
ab2 = tf.stack([a,b], axis=0)
sess = tf.Session()
print(sess.run(ab1))
print(sess.run(ab2))
print(sess.run(ab1).shape)
print(sess.run(ab2).shape)
方法:从外层括号分析到内层括号,axis从0依次递增。
注意:tf.concat是不新增维度,单纯拼接,tf.stack是新增一个维度,所以axis的值可以比维度大一
举例说明:
axis = 0时:最外层括号(实际我们只看最外层括号里面的内容,这里要注意tf.stack因为是增加维度,所以并不分析到里面的内容,增加维度和不增加维度的区别所在)
在tf.concat
函数中,所以ab1
是[1,2,3],[4,5,6]
与[7,8,9],[10,11,12]
,`顺序拼接为:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
在tf.stack
函数中,ab2
是[[1,2,3],[4,5,6]]与[[7,8,9],[10,11,12]],
在最外层新增一个维度,即是两个二维数组合并为三维:
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
axis = 1时:第二层括号(实际我们只看第二层括号里面的内容,)
在tf.concat
函数中,例如[[1,2,3],[4,5,6]]
中的1,2,3,这里不加括号是因为我们分析的是第二层括号了,已经分析到里面的元素了所以ab1
是a的1,2,3
与b的7,8,9]拼接为
,
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
在tf.stack
函数中,因为axis=1,ab2
是[1,2,3]与[7,8,9],
这里新增一个维度,也就是很多资料说第二个维度增加一个数字的原因所在:
[[[ 1 2 3]
[ 7 8 9]]
[[ 4 5 6]
[10 11 12]]]
axis = 2时:tf.concat
已经不能再分析了,因为已经元素级了,在tf.stack
中,ab2是1,2,3与7,8,9以一一对应的方式stack,
这里新增一个维度,第三个维度增加一个数字2:
[[[ 1 7]
[ 2 8]
[ 3 9]]
[[ 4 10]
[ 5 11]
[ 6 12]]]
到这里就分析完整了,从数据层面讲解了对数据不同的处理方式,仅个人见解,不到之处敬请谅解。