使用 tensorflow 而不是 numpy 进行数值近似是个好主意吗?

数据挖掘 Python 张量流 麻木的
2022-03-05 21:25:56

我打算对物理问题进行一些数值近似。

该程序的主要要点是对大型稀疏矩阵执行 svd 并计算大型矩阵的迹。

我在 python 中使用 numpy/scipy 和 multiprocessing 模块来执行此操作,但速度不够快。

我还在一些 gpus 上使用 tensorflow 实现了相同的代码。Tensorflow 的计算速度要快得多,但是将数据发送到 gpus 并将其带出需要很长时间。每个数据实例都作为浮点值单独发送。有什么方法可以一次将所有数据发送到 gpu 中?

使用 tensorflow 进行数值计算是好主意还是坏主意?

下面是我的代码片段......

def Expectation_Value(density,N):
   expec=0
   for i in np.arange(1,N+1):
       a=tf.linalg.trace(tf.matmul(Sigma(i,N,Sz),density))
       expec+=a
return expec/N

def main():
   df=pd.read_csv('.....')
   sess=tf.Session()

   for l in range(len(df)):
   Delta=df['Delta'].iloc[l]
   Omega=df['Omega'].iloc[l]
   Gamma=df['Gamma'].iloc[l]
   J=df['J'].iloc[l]


    Sz_tens=tf.zeros(len(df))
    Expec=Expectation_Value(DMT,N)
    Sz_tens[l]=Expec
Sz_arr=Sz_tens.eval(session=sess)
df['Sz']=Sz_arr
sess.close()
df.head()
1个回答

TensorFlow 是一个支持数据流范式的库,这使其成为数值计算的良好候选者。

一般来说,TensorFlow 数据加载性能可以使用tf.data模块进行优化。特别是,有一个称为 GPU 饥饿的概念,其中 GPU 正在等待加载数据。GPU 饥饿可以在 TensorFlow 中通过Pipelining最小化,重叠训练步骤的预处理和模型执行。

特别是,可以通过重构Expectation_Value对向量而不是标量进行操作来优化您的代码。现在Ni是标量,并且有一个 for 循环一次处理一个元素。tf.linalg.trace可以将张量作为输入,因此Ni可以是向量。一旦对向量进行操作并且不再使用 for 循环,该函数将快得多。