【问题标题】:Cartesian product when dimension is None维度为无时的笛卡尔积
【发布时间】:2019-05-26 03:48:37
【问题描述】:

这与 TensorFlow 中的一个实现问题有关。我有一个张量H,大小为(batch_size, time_steps, 256)(但batch_sizetime_steps 在构建期间是None)。

我想计算形状为(batch_size, time_steps, time_steps, n_dim) 的张量A,它是跨时间维度的笛卡尔积。因此,简单来说:

A[:,i,j,:] = some_func(H[:,i,:], H[:,j,:])

由于在构建图形时 time_steps 的数量是 None,那么计算 A 的优雅方法是什么?

【问题讨论】:

    标签: tensorflow keras cartesian-product


    【解决方案1】:

    当指定time_steps 轴的大小(即不是None)时,我有一个解决方案。我们可以很容易地使用K.repeat_elementsK.tile 来形成笛卡尔积的张量:

    from keras import layers, models
    from keras import backend as K
    
    def some_func(a, b):
        # define the some_func here
        return a + b
    
    def cart_prod(x):
        shp = K.int_shape(x)[1]
        x_rep = K.repeat_elements(x, shp, axis=1)
        x_tile = K.tile(x, [1, shp, 1])
        res = some_func(x_rep, x_tile)
        return K.reshape(res, [-1, shp, shp, K.shape(res)[-1]])
    
    inp = layers.Input((3, 2))
    out = layers.Lambda(cart_prod)(inp)
    model = models.Model(inp, out)
    
    model.predict(np.arange(6).reshape(1, 3, 2))
    

    输出:

    array([[[[ 0.,  2.],
             [ 2.,  4.],
             [ 4.,  6.]],
    
            [[ 2.,  4.],
             [ 4.,  6.],
             [ 6.,  8.]],
    
            [[ 4.,  6.],
             [ 6.,  8.],
             [ 8., 10.]]]], dtype=float32)
    

    【讨论】:

    • 是的,当time_steps 已知时,以您的方式执行此操作也更容易。一种方法是填充 time_steps 维度并固定它并遵循相同的程序。但这不是我想做的。我一直在寻找一种优雅的方式,以便仍然能够使用未知的time_steps
    【解决方案2】:

    您可以使用 TensorFlow 的广播属性来构造张量之间的笛卡尔积,方法是将一个张量扩展一个额外的维度并将其与另一个张量相乘。

    import tensorflow as tf
    
    A = tf.placeholder(shape=(None, None, 256), dtype=tf.float32)
    B = tf.placeholder(shape=(None, None, 256), dtype=tf.float32)
    
    A_ = tf.expand_dims(A, axis=1)
    
    A_*B
    

    给予

    <tf.Tensor 'mul_1:0' shape=(?, ?, ?, 256) dtype=float32>
    

    【讨论】:

    • 这不符合确切的目的。上面的 A_*B 将是 (batch_size, 1, num_steps, 256) 的形状,并且仍然是 A 和 B 的元素乘法。这不是两个张量的笛卡尔积
    • 你说得对,我回答得太快了。我会看看我是否可以更新我的答案。不过应该可以通过广播实现。
    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多