Tensorflow-tf.concat()显示不同的结果

时间:2018-05-01 09:10:12

标签: python python-3.x tensorflow

with tf.Session() as sess:
t1 = [
    [[0],[1],[2]],
    [[3],[4],[5]],
]
print(sess.run(tf.shape(t1)))
print(sess.run(tf.concat(t1,1)))
print("**********")
t2 = np.arange(6).reshape([2,3,1])
print(sess.run(tf.shape(t2)))
print(sess.run(tf.concat(t2,1)))

然后显示

[2 3 1]
[[0 3] [1 4] [2 5]]
[2 3 1]
[[[0] [1] [2]] [[3] [4] [5]]]

t1和t2具有相同的形状和值,为什么结果不同?

2 个答案:

答案 0 :(得分:0)

因为t1list,而t2不是。{/ p>

tf.concat连接张量列表。因此,t1被视为两个大小为3x1的张量的列表。另一方面,t2是一个numpy数组,转换为单个2x3x1 Tensor,没有其他任何东西可以连接这个张量。

我认为可能让您感到惊讶的是t1根据具体情况有不同的解释。 tf.shape期望Tensor作为参数,而不是张量列表,因此当传递给此函数时,t1被解释为2x3x1张量。

答案 1 :(得分:0)

来自tf.concat()的文档页面:

tf.concat(
values,
axis,
name='concat')
...
Concatenates !!the list!! of tensors values along dimension axis,
...
the data from the input tensors is joined along the axis dimension.

tf.concat()列表的张量作为输入。 t1是一个列表。 tf.shape(t1)将其转换为单个张量并返回其形状。 tf.concat(t1,1)将t1视为列表2对象:[[0],[1],[2]][[3],[4],[5]]。它将t1转换为包含2个形状(3,1)张量的列表,将它们连接起来并返回形状的张量(3,2)。 要验证这一点,您可以运行以下示例:

with tf.Session() as sess:
  t1 = [
    [[0],[1],[2]],
    [[3],[4],[5]],
  ]

  t100 = [[0],[1],[2]]
  t101 = [[3],[4],[5]]
  print(sess.run(tf.concat(t1,1)))
  # construct a list from t100 and t101
  print(sess.run(tf.concat([t100, t101],1)))

两者都会返回相同的结果。 另一方面,t2是一个numpy数组,tf.concat(t2,1),将t2视为包含单个numpy数组的列表,因此不会发生连接,它实质上会返回t2。