代码之家  ›  专栏  ›  技术社区  ›  Matt

如何将两个形状不同的张量与张量流连接起来?

  •  1
  • Matt  · 技术社区  · 6 年前

    你好,我是新来的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_dims tf.reshape 或许能帮上忙。。。

    谢谢你分享你的知识。

    2 回复  |  直到 6 年前
        1
  •  2
  •   sdcbr    6 年前

    这应该可以做到:

    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
  •  2
  •   episodeyang    6 年前

    实际上有一个不同的技巧,在诸如OpenAI基线之类的代码库中经常使用。

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

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

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

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

    零乘法将 性病 .

    好好享受,祝你训练顺利!

    附言: numpy tensorflow concat 运算符不自动应用广播,因为根据维护者的说法,当两个张量的形状不匹配时,通常是编程错误的结果。这在numpy中并不是什么大问题,因为计算是迫切需要评估的。但对于tensorflow,这意味着您必须使用 tf.shape 接线员。