对比tensordot、matmul、einsum速度
准备自己实现capsule Net
,今天看了下别人实现的版本,感觉里面的矩阵乘积应该是可以优化的。
然后我写代码的时候,感觉一个可以优化的点是不同维度之间的Tensor
的矩阵乘积,所以我做了一个小测试。
说明
因为capsule net
中全连接需要权值乘上输入向量: \[
\begin{aligned}
\hat{u}_{j|i}&=W_{ij}u_i \\
W_{ij} &= [Len_{l},Len_{l+1}] \\
u_i &= [batch,N_l,Len_{l}]
\end{aligned}
\]
他的实例是: \[ \begin{aligned} W_{ij} &= [8,16] \\ u_i &= [batch,1152,8] \end{aligned} \]
因为两个Tensor
的维度不一样,所以在他的代码中都是tile
然后进行计算的.然后我找了几个矩阵计算的函数进行比较(使用
tensorflow 2.0).
import tensorflow.python as tf |
结果
(tf2) ➜ tf2 /home/zqh/miniconda3/envs/tf2/bin/python /home/zqh/Documents/tf2/test/test_fuc.py |
实验发现einsum
的效率更加高.
疑问
在tensorflow 2.0
中明明可以使用@tf.function
来优化运行速度.但是我在上面的程序中使用这个方式,反而速度更慢了...
(tf2) ➜ tf2 /home/zqh/miniconda3/envs/tf2/bin/python /home/zqh/Documents/tf2/test/test_fuc.py |