TensorFlow中的双线性张量积

Ale*_*ail 16 tensorflow

我正在努力重新实施本文,关键操作是双线性张量积.我几乎不知道这意味着什么,但是纸张有一个很好的小图形,我明白了.

在此输入图像描述

关键操作是e_1*W*e_2,我想知道如何在tensorflow中实现它,因为其余部分应该很容易.

基本上,给定3D张量W,将其切割成矩阵,对于第j个切片(矩阵),将其在每一侧乘以e_1e_2,得到标量,这是结果向量中的第j个条目(输出此操作).

所以我想要执行e_1的乘积,d维向量,W,dxdxk张量,和e_2,另一个d维向量.这个产品能否像现在一样在TensorFlow中简明扼要地表达,还是我必须以某种方式定义自己的操作?

早期编辑

为什么这些张量的乘法不起作用,是否有某种方法可以更明确地定义它以使其有效?

>>> import tensorflow as tf
>>> tf.InteractiveSession()
>>> a = tf.ones([3, 3, 3])
>>> a.eval()
array([[[ 1.,  1.,  1.],
        [ 1.,  1.,  1.],
        [ 1.,  1.,  1.]],

       [[ 1.,  1.,  1.],
        [ 1.,  1.,  1.],
        [ 1.,  1.,  1.]],

       [[ 1.,  1.,  1.],
        [ 1.,  1.,  1.],
        [ 1.,  1.,  1.]]], dtype=float32)
>>> b = tf.ones([3, 1, 1])
>>> b.eval()
array([[[ 1.]],

       [[ 1.]],

       [[ 1.]]], dtype=float32)
>>> 
Run Code Online (Sandbox Code Playgroud)

错误消息是

ValueError: Shapes TensorShape([Dimension(3), Dimension(3), Dimension(3)]) and TensorShape([Dimension(None), Dimension(None)]) must have the same rank
Run Code Online (Sandbox Code Playgroud)

目前

事实证明,两个3D张量相乘也无法正常工作tf.matmul,但tf.batch_matmul确实如此.tf.batch_matmul还将做3D张量和矩阵.然后我尝试了3D和矢量:

ValueError: Dimensions Dimension(3) and Dimension(1) are not compatible
Run Code Online (Sandbox Code Playgroud)

mda*_*ust 12

您可以通过简单的重塑来完成此操作.对于两个矩阵乘法中的第一个,你有k*d,长度为d的矢量与dot product.

这应该是接近的:

temp = tf.matmul(E1,tf.reshape(Wddk,[d,d*k]))
result = tf.matmul(E2,tf.reshape(temp,[d,k]))
Run Code Online (Sandbox Code Playgroud)

  • 这样做没有"更清洁"的方式吗?美学上让我困扰的是我必须做所有这些重塑,但如果这就是我必须要做的......如何在tensorflow中实现重塑?他们是否会移动所有值,或者只是用于读取值的模式? (3认同)