tf.concat与tf.stack的区别

import tensorflow as tf

a = tf.constant([[1,2,3],[4,5,6]])
b = tf.constant([[7,8,9],[10,11,12]])
c1 = tf.concat([a,b],axis=0)
s1 = tf.stack([a,b], axis=0)
c2 = tf.concat([a,b],axis=1)
s2 = tf.stack([a,b], axis=1)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(c1))
print("\n")
print(sess.run(c2))
print("\n")
print(sess.run(s1))
print("\n")
print(sess.run(s2))

输出结果如下:

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]

[[ 1  2  3  7  8  9]
 [ 4  5  6 10 11 12]]

[[[ 1  2  3]
  [ 4  5  6]]
 [[ 7  8  9]
  [10 11 12]]]

[[[ 1  2  3]
  [ 7  8  9]]
 [[ 4  5  6]
  [10 11 12]]]

从上面可以可以看出,tf.concat不改变拼接前后矩阵的维数(这个维数是指原来是2维的,拼接后也是2维的,而不是三维的)。但是会改变对应的维数的大小。比如axis=0的时候,行数增加了,表示在0轴上进行拼接,axis=1的时候列数增加了,表示在1轴上进行拼接。

tf.stack会改变前后矩阵的维数,比如拼接之前是2维的,拼接之后就都变成3维了。

  1. axis=0表示将拼接之前的矩阵的0轴所在的元素用[]括起来(上面的例子中就是将矩阵1的每一行的元素[1 2 3]与[4 5 6]用[]括起来),之后将这个整体作为新的矩阵的一个元素。
  2. axis=1表示将拼接之前的每个矩阵的1轴所在的元素对应起来之后用[]括起来(上面的例子中就是将矩阵1的列方向的第一个元素[1 2 3]与矩阵2的列方向的第一个元素[7 8 9]用[]括起来),之后将这个整体作为新的矩阵的一个元素。

也可以看出,axis=0是将矩阵内部的元素进行组合(不涉及与其他矩阵的元素进行组合),作为新矩阵的一个元素,axis=1是将每个矩阵对应的元素进行组合(涉及与其他矩阵的元素进行组合),作为新矩阵的一个元素。

你可能感兴趣的:(tensorflow)