Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 点积和矩阵乘法的Tensorflow_Python_Performance_Numpy_Tensorflow - Fatal编程技术网

Python 点积和矩阵乘法的Tensorflow

Python 点积和矩阵乘法的Tensorflow,python,performance,numpy,tensorflow,Python,Performance,Numpy,Tensorflow,我目前正在尝试用Tensorflow编写一些线性代数代码,并将其性能与numpy实现进行比较。对于重复矩阵向量乘法或重复矩阵矩阵乘法,Tensorflow代码的速度要慢几个数量级,这是一个难题。我目前正在测试Tensorflow,没有GPU,只使用CPU。我的意图是在Tensorflow中实现我的项目,这样它在CPU和GPU上都能快速运行,这取决于用户拥有什么。矩阵大小可以在大约10x10到非常大的矩阵之间变化。当使用tensorflow拥有一个公共代码库时,我愿意接受小矩阵的性能损失,只要它不

我目前正在尝试用Tensorflow编写一些线性代数代码,并将其性能与numpy实现进行比较。对于重复矩阵向量乘法或重复矩阵矩阵乘法,Tensorflow代码的速度要慢几个数量级,这是一个难题。我目前正在测试Tensorflow,没有GPU,只使用CPU。我的意图是在Tensorflow中实现我的项目,这样它在CPU和GPU上都能快速运行,这取决于用户拥有什么。矩阵大小可以在大约10x10到非常大的矩阵之间变化。当使用tensorflow拥有一个公共代码库时,我愿意接受小矩阵的性能损失,只要它不像下面那样剧烈

以下是IPython提供的两个计时示例:

%%timeit
dim=10000
m1=np.随机均匀(尺寸)
m2=np.随机均匀(尺寸,尺寸)
tmp=np.dot(m2,m1)
对于范围(200)内的i:
tmp=np.dot(m2,tmp)
这需要151µs±6.56µs

现在使用Tensorflow:

%%timeit
a1=tf.随机.均匀([尺寸,尺寸])
a2=tf.随机.均匀([dim])
tmp=tf.tensordot(a1,a2,1)
对于范围(200)内的i:
tmp=tf.tensordot(a1,tmp,1)
仅需1.07 s±128 ms。然后,评估再次需要7.5 s

sess=tf.Session()
使用sess.as_default():
out=tmp.eval()
我在使用matmul时也观察到了同样的趋势

非常感谢您的任何提示


Peter

您的代码中有几个问题

  • np.random.uniform(dim)
    np.random.uniform(dim,dim)
    返回两个浮点数,而不是两个矩阵。您可能希望使用
    np.random.rand(dim)
    np.random.rand(dim,dim)

  • 您可以使用timeit创建图形,以及生成随机矩阵。我建议只使用timeit
    np.dot
    sess.run()

  • 下面是
    tf.matmul
    np.dot
    的基准代码,它改编自

    将tensorflow导入为tf
    将numpy作为np导入
    导入操作系统
    导入时间
    n=10000
    dtype=tf.32
    使用tf.device(“/cpu:0”):
    matrix1=tf.Variable(tf.ones((n,n),dtype=dtype))
    matrix2=tf.Variable(tf.ones((n,n),dtype=dtype))
    product=tf.matmul(matrix1,matrix2)
    #避免优化冗余节点
    config=tf.ConfigProto(graph\u options=tf.GraphOptions(optimizer\u options=tf.Optimizations(opt\u level=tf.Optimizations.L0)))
    sess=tf.Session(config=config)
    sess.run(tf.global\u variables\u initializer())
    iters=10
    #预热
    sess.run(product.op)
    开始=时间。时间()
    对于范围内的i(iters):
    sess.run(product.op)
    end=time.time()
    已用=(结束-开始)
    打印('tensorflow cpu:%d x%d个matmul占用了%.2f秒“%(n,n,已用/iters))
    ###########努比试验###########
    np_m1=np.one((n,n),dtype=np.float32)
    np_m2=np.one((n,n),dtype=np.float32)
    开始=时间。时间()
    对于范围内的i(iters):
    np.dot(np_m1,np_m2)
    end=time.time()
    已用=(结束-开始)
    打印('numpy:%d x%d个matmul占用:%.2f秒'%(n,n,已用/iters))
    
    在我的机器中,输出是

    #tensorflow cpu:10000 x 10000 matmul耗时:2.79秒
    #numpy:10000 x 10000 matmul耗时:4.36秒
    
    非常感谢您的回复。我完全可以看到我的实现中的缺陷。但是,我不认为您的比较是一个公平的比较,因为所有的图形定义的东西和初始化不是基准的一部分。如果我将它们包括在基准中,那么numpy要小得多。这也适用于增加矩阵维数。特别是在这里,会话初始化可以轻松地占用实际计算时间的10倍(对于增加矩阵维数来说不是固定的)。此外,当包含重复矩阵mult时。定义如上所述,图形构建要慢得多。…。@P.Egli实际上,与实际训练神经网络时的训练时间相比,创建图形的时间可以忽略不计。另外,由于您比较的是矩阵乘法,因此图形构建不被视为矩阵计算的一部分。感谢您的澄清。是的,也许我应该说我试着加速一些线性代数计算,它们只运行一次。这与训练神经网络完全不同。我的意图是为我建模的某个系统加速大量矩阵乘法运算。因此,我对“一次性拍摄”感兴趣。我很高兴,如果您有任何想法如何加速它们…。@P.Egli也许您可以检查包含GEMM函数的blas库。他们以某种方式优化了矩阵乘法。希望您能获得一些见解。:)