TensorFlow中不广播tf.matmul
我有一个我一直在努力解决的问题。它与TensorFlow中不广播tf.matmul,tensorflow,broadcasting,Tensorflow,Broadcasting,我有一个我一直在努力解决的问题。它与tf.matmul()及其不广播有关 我知道在上有一个类似的问题,但是tf.batch\u matmul()看起来不适合我的情况 我需要将输入数据编码为4D张量: X=tf.placeholder(tf.float32,shape=(无,无,无,100)) 第一个维度是批次的大小,第二个维度是批次中的条目数。 您可以将每个条目想象为多个对象(三维)的组合。最后,每个对象由100个浮点值的向量描述 请注意,我在第二和第三维度中使用了None,因为每个批次的实际尺
tf.matmul()
及其不广播有关
我知道在上有一个类似的问题,但是tf.batch\u matmul()
看起来不适合我的情况
我需要将输入数据编码为4D张量:
X=tf.placeholder(tf.float32,shape=(无,无,无,100))
第一个维度是批次的大小,第二个维度是批次中的条目数。
您可以将每个条目想象为多个对象(三维)的组合。最后,每个对象由100个浮点值的向量描述
请注意,我在第二和第三维度中使用了None,因为每个批次的实际尺寸可能会发生变化。然而,为了简单起见,让我们用实际数字来塑造张量:
X=tf.placeholder(tf.float32,shape=(5,10,4100))
以下是我计算的步骤:
W=tf.Variable(tf.truncated_normal([100,50],stddev=0.1))
Y=tf.matmul(X,W)
问题:tf.matmul()没有广播,使用tf.batch\u matmul()也没有成功
Y的预期形状:(5,10,4,50)Y\u avg=tf.reduce\u均值(Y,2)
Y_平均值的预期形状:(5,10,50)tf.matmul()
会支持广播。然后我找到了tf.batch_matmul()
,但它看起来仍然不适用于我的情况(例如,W至少需要有3个维度,不清楚为什么)
顺便说一句,上面我使用了一个简单的线性函数(其权重存储在W中)。但在我的模型中,我有一个很深的网络。所以,我遇到的更普遍的问题是,自动计算张量的每个切片的函数。这就是为什么我期望tf.matmul()
会有广播行为(如果是这样,可能根本不需要tf.batch\u matmul()
)
期待向您学习!
Alessio你可以通过重塑
X
来塑造[n,d]
,其中d
是一个计算“实例”的维度(在你的例子中为100),而n
是多维对象中这些实例的数量(在你的例子中5*10*4=200)。重塑后,可以使用tf.matmul
然后重塑回所需形状。前三个维度可能会有所不同,这一点很棘手,但您可以使用tf.shape
在运行时确定实际的形状。最后,您可以执行计算的第二步,这应该是一个简单的tf。在各个维度上减少_mean
。总之,它看起来是这样的:
X = tf.placeholder(tf.float32, shape=(None, None, None, 100))
W = tf.Variable(tf.truncated_normal([100, 50], stddev=0.1))
X_ = tf.reshape(X, [-1, 100])
Y_ = tf.matmul(X_, W)
X_shape = tf.gather(tf.shape(X), [0,1,2]) # Extract the first three dimensions
target_shape = tf.concat(0, [X_shape, [50]])
Y = tf.reshape(Y_, target_shape)
Y_avg = tf.reduce_mean(Y, 2)
正如您链接的文件的重命名标题所示,您应该使用。它使两个张量之间的轴对收缩与Numpy的一致。对于您的情况:
X = tf.placeholder(tf.float32, shape=(5, 10, 4, 100))
W = tf.Variable(tf.truncated_normal([100, 50], stddev=0.1))
Y = tf.tensordot(X, W, [[3], [0]]) # gives shape=[5, 10, 4, 50]
谢谢你的回答。不幸的是,您的解决方案有两个问题:1。它在所有向量上取平均值,这是不正确的2。重塑仅在固定形状张量的情况下有效,而我有前3个维度变化的批次(每个批次固定,各批次不同),为什么它在所有向量上都是平均值X[i,j,k,:]
构成一个向量,对吗?通过按照我建议的方式进行重塑,我们将这些向量堆叠在一个大矩阵中(每行包含一个向量)。如果我们现在做矩阵乘法,每一行分别与矩阵相乘。现在,我们可以对每一行执行所需的操作(例如,取平均值,如您的示例中所示),然后重新安排到我们想要的形状。我看不出向量的平均值在哪里,但我可能遗漏了一些东西。关于第二个问题,只要向量的维数(在你的例子中为100)是固定的,tf.reformate(X,[-1100])
应该可以正常工作吗?使用-1
,现在不需要先验地计算其他维度。没错,它并不是所有向量的平均值,但您实现的并不是我需要的。您的代码所做的是为每个向量获取一个标量,而我需要为张量的每个片段获取一个平均向量。事实上,在我的问题中,我指出Y_avg的预期形状必须是(5,10,50):第三维消失了,因为我们得到了50个元素的平均向量。对于第二个问题,我确实可以使用-1来重塑,但是我不能回到原来的张量形式。如果我的问题不是100%清楚,我深表歉意,再次感谢您的帮助!PS:Y\u avg\u
在你的代码中有形状(200),因此你甚至不能用Y\u avg=tf重塑。重塑(Y\u avg[5,10,50])
因为200!=5*10*50