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具有相同的形状和值,为什么结果不同?
答案 0 :(得分:0)
因为t1
是list
,而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。