要构建一个胶囊网络训练脚本,我需要计算许多小的矩阵向量乘法。
每个权重矩阵的大小最多为20 x20。
权重矩阵的数量超过900。
我很好奇tf.matmul
或tf.linalg.matvec
是对此的最佳选择。
有人可以给我一个优化训练脚本的提示吗?
答案 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)