我一直在努力解决一个问题。它与tf.matmul()
广播有关,并且没有广播。
我在https://github.com/tensorflow/tensorflow/issues/216上发现了类似的问题,但是tf.batch_matmul()
对于我的情况而言,这似乎并不是一个解决方案。
我需要将输入数据编码为4D张量:X = tf.placeholder(tf.float32, shape=(None, None, None, 100))
第一个维度是批处理的大小,第二个维度是批处理中的条目数。您可以将每个条目想象成由许多对象(三维)组成。最后,每个对象由100个浮点值的向量描述。
请注意,我在第二和第三个维度中使用了“无”,因为实际尺寸可能会在每批中发生变化。但是,为简单起见,让我们用实际数字塑造张量:X = tf.placeholder(tf.float32, shape=(5, 10, 4, 100))
这些是我计算的步骤:
计算100个浮点值的每个向量的函数(例如,线性函数)W = tf.Variable(tf.truncated_normal([100, 50], stddev=0.1))
Y = tf.matmul(X, W)
问题:tf.matmul()
使用tf.batch_matmul()
Y的预期形状进行广播或成功:(5,10,4,50)
对批次的每个条目(在每个条目的对象上)应用平均池:Y_avg = tf.reduce_mean(Y, 2)
Y_avg的预期形状:(5,10,50)
我希望那tf.matmul()
会支持广播。然后我发现tf.batch_matmul()
,但看起来仍然不适用于我的情况(例如W需要至少具有3个维度,不清楚原因)。
顺便说一句,上面我使用了一个简单的线性函数(其权重存储在W中)。但是在我的模型中,我有一个深层的网络。因此,我遇到的更普遍的问题是为张量的每个切片自动计算一个函数。这就是为什么我希望那tf.matmul()
会产生广播行为(如果是这样,也许tf.batch_matmul()
甚至没有必要)。
期待您的学习!亚历西奥
您可以通过重塑X
为shape来实现这一点[n, d]
,其中d
,单个计算“实例”的维数(在您的示例中n
为100),在多维对象中为这些实例的数量(5*10*4=200
在您的示例中)。重塑后,您可以使用tf.matmul
然后重塑回所需的形状。前三个尺寸可以变化,这一点有点棘手,但是您可以tf.shape
用来确定运行时的实际形状。最后,您可以执行计算的第二步,tf.reduce_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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句