如何使用 TensorFlow 连接两个具有不同形状的张量?

Posted

技术标签:

【中文标题】如何使用 TensorFlow 连接两个具有不同形状的张量?【英文标题】:How to concatenate two tensors having different shape with TensorFlow? 【发布时间】:2019-01-07 04:33:17 【问题描述】:

您好,我是 TensorFlow 新手,我想将 2D 张量连接到 3D 张量。我不知道如何通过利用 TensorFlow 函数来做到这一点。

tensor_3d = [[[1,2], [3,4]], [[5,6], [7,8]]]  # shape (2, 2, 2)
tensor_2d = [[10,11], [12,13]]                # shape (2, 2)

out: [[[1,2,10,11], [3,4,10,11]], [[5,6,12,13], [7,8,12,13]]]  # shape (2, 2, 4)

我会通过使用循环和新的 numpy 数组来使其工作,但这样我就不会使用 TensorFlow 转换。关于如何使这成为可能的任何建议?我看不出像 tf.expand_dimstf.reshape 这样的转换可能对这里有什么帮助......

感谢您分享您的知识。

【问题讨论】:

【参考方案1】:

这应该可以解决问题:

import tensorflow as tf

a = tf.constant([[[1,2], [3,4]], [[5,6], [7,8]]]) 
b = tf.constant([[10,11], [12,13]])

c = tf.expand_dims(b, axis=1) # Add dimension
d = tf.tile(c, multiples=[1,2,1]) # Duplicate in this dimension
e = tf.concat([a,d], axis=-1) # Concatenate on innermost dimension

with tf.Session() as sess:
    print(e.eval())

给予:

[[[ 1  2 10 11]
[ 3  4 10 11]]

[[ 5  6 12 13]
[ 7  8 12 13]]]

【讨论】:

【参考方案2】:

实际上还有一个不同的技巧,它不时用于代码库,例如 OpenAI 的基线。

假设您的高斯策略有两个张量。 mustd。批量大小为 1 的标准差与 mu 的形状相同,但由于您对所有操作使用相同的参数化标准差,因此当批量大小大于 1 时,两者会有所不同:

mu : Size<batch_size, feat_n>
std: Size<1, feat_n>

在这种情况下,要做的一件简单的事情(就像 OpenAI 基线所做的那样)是:

params = tf.concat([mu, mu * 0 + std])

零乘法将std 转换为与mu 相同的等级。

享受训练,祝你好运!

ps:numpytensorflowconcat 运算符不会自动应用广播,因为根据维护者的说法,当两个张量的形状不匹配时,通常是编程错误的结果。这在 numpy 中没什么大不了的,因为计算是急切地评估的。但是对于 tensorflow,这意味着您必须使用 tf.shape 运算符手动显式广播较低等级(或具有形状 [1, *_] 的等级)。

【讨论】:

以上是关于如何使用 TensorFlow 连接两个具有不同形状的张量?的主要内容,如果未能解决你的问题,请参考以下文章

同形异义字:看我如何拿到TaoBao.com的解析权

如何(有效地)在TensorFlow中应用通道方式的完全连接层

如何在不合并索引的情况下连接具有不同多索引的两个数据帧?

如何使用 tensorflow 构建多输入图?

当我在 Tensorflow 上使用 Keras API 连接两个模型时,模型的输入张量必须来自 `tf.layers.Input`

如何在火花中合并或连接具有不相等列号的数据框