针对许多小型矩阵向量乘法优化Tensorflow

时间:2020-10-13 13:51:19

标签: tensorflow matrix-multiplication

要构建一个胶囊网络训练脚本,我需要计算许多小的矩​​阵向量乘法。 每个权重矩阵的大小最多为20 x20。
权重矩阵的数量超过900。

我很好奇tf.matmultf.linalg.matvec是对此的最佳选择。 有人可以给我一个优化训练脚本的提示吗?

1 个答案:

答案 0 :(得分:2)

编辑:

看着您所指的notebook,看来您具有以下参数:

batch_size = 50
caps1_n_caps = 1152
caps1_n_dims = 8
caps2_n_caps = 10
caps2_n_dims = 16

然后,您有一个张量w,形状为(caps1_n_caps, caps2_n_caps, caps2_n_dims, caps1_n_dims)(在笔记本中,它的初始尺寸为1,我正在跳过),另一个张量为caps1_output形状为(batch_size, caps1_n_caps, caps1_n_dims)。并且您需要将它们组合以产生形状为caps2_predicted的{​​{1}}。

在笔记本中,它们平铺张量以便使用tf.linalg.matmul进行操作,但实际上,您可以仅使用tf.einsum来计算相同结果而无需任何平铺:

(batch_size, caps1_n_caps, caps1_n_dims, caps2_n_dims)

我不确定我是否完全了解您想要的内容,但是您说您想计算类似的内容:

û ij = W ij × u i

对于几个矩阵<​​em> W 和向量 u 的集合。假设您有900个矩阵和向量,矩阵的大小为20×20,向量的大小为20,则可以将它们表示为两个import tensorflow as tf batch_size = 50 caps1_n_caps = 1152 caps1_n_dims = 8 caps2_n_caps = 10 caps2_n_dims = 16 w = tf.zeros((caps1_n_caps, caps2_n_caps, caps2_n_dims, caps1_n_dims), dtype=tf.float32) caps1_output = tf.zeros((batch_size, caps1_n_caps, caps1_n_dims), dtype=tf.float32) caps2_predicted = tf.einsum('ijkl,bil->bilk', w, caps1_output) print(caps2_predicted.shape) # (50, 1152, 8, 16) ,形状为ws(900, 20, 20)的张量形状为us。如果这样做,结果(900, 20)的形状为us_hat,将被简单地计算为:

(900, 20, 20)
相关问题