Tensorflow有一个名为batch_matmul的函数,它可以将更高维的张量相乘.但是我很难理解它是如何工作的,也许部分是因为我很难想象它.
我想要做的是将矩阵乘以3D张量的每个切片,但我不太明白张量a的形状是什么.z是最里面的维度吗?以下哪项是正确的?
我最希望第一个是正确的 - 它对我来说最直观,很容易在.eval()输出中看到.但我怀疑第二个是正确的.
Tensorflow说batch_matmul执行:
out[..., :, :] = matrix(x[..., :, :]) * matrix(y[..., :, :])
那是什么意思?在我的例子中,这意味着什么?什么与什么相乘?为什么我没有按照预期的方式获得3D张量?
你可以把它想象成对批处理中的每个训练样例做一个matmul.
例如,如果您有两个具有以下尺寸的张量:
a.shape = [100, 2, 5] b.shape = [100, 5, 2]
并且你做了一个批处理tf.matmul(a, b)
,你的输出将具有形状[100, 2, 2]
.
100是您的批量大小,其他两个维度是数据的维度.
首先tf.batch_matmul()
被删除,不再可用.现在你想使用tf.matmul()
:
输入必须是矩阵(或秩> 2的张量,表示矩阵批量),具有匹配的内部维度,可能在换位之后.
所以我们假设你有以下代码:
import tensorflow as tf batch_size, n, m, k = 10, 3, 5, 2 A = tf.Variable(tf.random_normal(shape=(batch_size, n, m))) B = tf.Variable(tf.random_normal(shape=(batch_size, m, k))) tf.matmul(A, B)
现在你将收到一个形状的张量(batch_size, n, k)
.这是这里发生的事情.假设你有batch_size
矩阵nxm
和batch_size
矩阵mxk
.现在,对于每对它们,你计算出nxm X mxk
哪个给你一个nxk
矩阵.你会拥有batch_size
它们.
请注意,这样的事情也是有效的:
A = tf.Variable(tf.random_normal(shape=(a, b, n, m))) B = tf.Variable(tf.random_normal(shape=(a, b, m, k))) tf.matmul(A, B)
并会给你一个形状 (a, b, n, k)