繁体   English   中英

python中的多线程优化

[英]multithreading optimization in python

我正在使用lmfit进行一些优化,而且速度很慢。 我的图像很大,基本上每个像素都在进行最小二乘最小化。 在我看来,它可能非常适合多线程或其他类型的优化,因为它目前非常缓慢。

因此,我的优化代码如下:

我将目标函数定义为:

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:还有其他可以尝试的优化方法吗?

就像评论所暗示的那样,这里的多线程不会有很多成果。 基本上,任何与lmfit或scipy匹配的结果都会以单线程fortran例程结尾,该例程会反复调用python目标函数,并使用这些结果生成下一步。 尝试使用多线程意味着必须在线程之间管理python目标函数和参数-fortran代码不适用于此目的,并且无论如何,计算实际上并不是I / O绑定的。

为了使用多个内核进行多处理是一种更好的方法。 但是尝试将多重处理用于单个拟合并不是听起来那么简单,因为目标函数和参数必须是可腌制的。 对于您的简单示例,这应该可行,但是随着问题使用更复杂的对象,该方法可能会失效。 莳萝包可以帮助您。

而且:由于您的问题自然并行化,因此有一个甚至更简单的解决方案。 只是针对每个像素分别进行拟合,每个像素都在自己的过程中进行。 您可以为此使用多重处理,或者甚至可以将问题分解为N个单独的实际进程,它们运行N个不同的脚本,每个脚本适合像素的1 / N。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM