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:これは簡単にマルチスレッドで拡大縮小できますか? 2:私が試すことができる他の最適化はありますか?

+2

私はあなたが何かを待っているわけではなく、実際には何かを待っているので、基本的にあなたのコードに "応答を待っている間に何かをする"と言っているマルチスレッド処理時間。代わりに、特に 'concurrent.futures'ライブラリを使ってマルチプロセッシングを調べることをお勧めします。 – LoicM

+0

コメントありがとうございます。私はこのライブラリが存在するかどうかはわかりませんでした。今見てみましょう! – Luca

+0

@LoicM残念ながら、いくつかの遺跡の理由から、私はpython2.7に悩まされています:/ – Luca

答えて

1

コメントが示唆しているように、ここでのマルチスレッドはあまり効果的ではありません。基本的に、lmfitやscipyを使った単一のフィットは、Pythonの目的関数を繰り返し呼び出すシングルスレッドのFortranルーチンで終わり、その結果を使って次のステップを生成します。マルチスレッドを使用しようとすると、Pythonの目的関数とパラメータをスレッド間で管理する必要があります。Fortranコードはこのためのものではなく、計算は実際にはI/Oバインドではありません。

複数のコアを使用するためのマルチプロセッシングは、より良いアプローチです。しかし、目的関数とパラメータがpickle-ableでなければならないので、単一の適合のためにマルチプロセッシングを使用しようとするのはそれほど簡単ではありません。あなたの単純な例では、これはうまくいくはずですが、問題がより複雑なオブジェクトを使用しているので、アプローチは壊れる可能性があります。ディルパッケージはそれを助けることができます。

また、自然に並列化されているため、さらに簡単な解決策があります。ちょうどピクセルごとに、それぞれ独自のプロセスで個別にフィットさせることです。そのためにマルチプロセッシングを使うこともできますし、問題をN個の別々の実際のプロセスに分割して、1/NピクセルのN個の異なるスクリプトを実行することもできます。

+0

私はマルチプロセッシングモジュールの使用を終了しました。それはまだ私が望むよりも遅いですが、もっと私ができることについては迷っています。 – Luca

関連する問題