函數scipy.optimize.fmin_bfgs
允許用戶輸入目標函數和漸變。因爲我有一個8芯機我的桌面上,我想我可以並行求解器運行scipy.optimize.fmin的天真並行化
from scipy import optimize
import itertools
import numpy as np
def single_grad_point((idx,px)):
p = px.copy()
epsilon = 10**(-6.0)
p[idx] += epsilon
d1 = err_func(p)
p[idx] -= 2*epsilon
d2 = err_func(p)
return (d1-d2)/(2*epsilon)
def err_func_gradient(p):
P = multiprocessing.Pool()
input_args = zip(*(xrange(len(p)), itertools.cycle((p,))))
sol = P.imap(single_grad_point, input_args)
return np.array(list(sol))
optimize.fmin_bfgs(err_func, p0, fprime=err_func_gradient)
概括地說,我使用的多計算梯度的每個方向。如果目標功能err_func
很貴,這似乎可以大大加快速度。然而,我的問題是關於所有multiprocessing.Pools
的使用和銷燬。由於err_func_gradient
可能會被稱爲幾萬次,因此會導致放緩或泄漏?
我已經看了,但SciPy的似乎並不具有平行的非線性優化。如果我錯了,我會把它當作答案來代替。 – Hooked
你能不能創建'multiprocessing.Pool'一次,然後把它作爲一個額外的參數'F'和'fprime'?這樣,您可以避免在每次迭代中構建/銷燬池所涉及的開銷。 –