0

我正在使用lmfit來做一些優化,它很單調。我有一個大的圖像,我基本上每個像素運行最小二乘法最小化。在我看來,它可能是多線程或其他類型優化的理想選擇,因爲目前它非常緩慢。python中的多線程優化

所以,我的優化代碼如下:

我定義的目標函數爲:

def objective(params, x, data): 
    s0 = params['S0'] 
    t1 = params['T1'] 
    m = s0 * (1.0 - np.exp(-x/t1)) 
    return m - data 

所以,我試圖儘量減少模型和觀測之間的差別。我認爲lmfit確保絕對值最小化,但我不知道,需要檢查。

主循環如下:

我需要一些初始值來估算如下作爲初始化參數:

p = Parameters() 
p.add('S0', value=1.0) 
p.add('T1', value=3.0) 

final_data = <numpy image> 
tis = np.asarray([1.0, 2.0, 3.0]) 

for i in range(final_data.shape[0]): 
    print "Processing pixel: ", i 
    minner = Minimizer(objective, params=p, fcn_args=np.asarray(tis), 
         final_data[i, :]), 
         nan_policy='propagate') 
    result = minner.minimize(method='least_squares') 
    s0_data[i] = result.params['S0'] 
    t1_data[i] = result.params['T1'] 

這工作不錯,但它是乏味慢。我試圖找出如何在python中執行多線程,並且對關於GIL鎖定的帖子感到非常困惑,並且python中的多線程並不存在。

我的問題是: 1:這可以用python中的多線程輕鬆縮放嗎? 2:是否有其他優化可以嘗試?

+2

從我看到你似乎沒有用於多線程,這基本上是告訴你的代碼「在等待響應時做其他事情」,因爲你不等待任何事情,什麼是實際處理時間。我建議看看多處理,特別是'concurrent.futures'庫 – LoicM

+0

感謝您的評論。我不知道這個圖書館存在。現在就來看看! – Luca

+0

@LoicM不幸的是,由於一些遺留的原因,我堅持使用python2.7:/ – Luca

回答

1

正如評論所暗示的,這裏的多線程並不會很有成效。基本上,任何與lmfit或scipy相匹配的單個函數都會以單線程Fortran例程重複調用您的python目標函數,並使用這些結果生成下一步。嘗試使用多線程意味着python的目標函數和參數必須在線程之間進行管理 - Fortran代碼並不適用於此,並且計算也不是真正的I/O限制。

多處理爲了使用多個核心是一個更好的方法。但是嘗試使用多處理進行單一擬合併不像聽起來那麼簡單,因爲目標函數和參數必須是可以實現的。舉個簡單的例子,這應該起作用,但是當問題使用更復雜的對象時,方法可能會中斷。蒔蘿包可以幫助。

但同時:對於您的問題,還有更簡單的解決方案,因爲它自然並行。只需要在每個像素上單獨安裝一個,每個安裝在他們自己的過程中。您可以爲此使用多處理,或者您甚至可以將問題分解成N個獨立的實際進程,運行N個不同的腳本,每個腳本適合1/N個像素。

+0

我結束了使用多處理模塊,它似乎可以擴展所有權利。它仍然比我想要的要慢,但我對我還能做什麼感到茫然。 – Luca