为什么此并行化脚本未返回正确的结果?



我正在尝试学习如何使用Python的multiprocessing模块。玩弄它,我尝试以非并行化和并行化的方式编写相同的代码。问题是它们返回不同的结果。

以下是非并行化版本:

import numpy as np
m = 3
num_points = 200
iterMax = 20
NMax = 3
np.random.seed(0)
y = np.random.rand(num_points,m)
w = list(range(NMax - 1))
for N in range(NMax-1):
w[N] = np.random.uniform(0,1,(N+2,np.size(y,axis=1))) - 0.5
iterCount = 1
while iterCount < iterMax:
for selectedInput in y:
w[N] = w[N] + (np.random.rand() - 0.5) * selectedInput
iterCount += 1    
for i in w:
print(i)

以下是并行化版本:

import numpy as np
import multiprocessing as mp
m = 3
num_points = 200
iterMax = 20
NMax = 3
np.random.seed(0)
y = np.random.rand(num_points,m)
def neuron_run(N):
w = np.random.uniform(0,1,(N+2,np.size(y,axis=1))) - 0.5 # Initialize weights
iterCount = 1
while iterCount < iterMax:
for selectedInput in y: 
w = w + (np.random.rand() - 0.5) * selectedInput
iterCount += 1    
return w
if __name__ == '__main__':
w = []
pool = mp.Pool(processes=NMax)
for N in range(NMax-1):
pool_result = pool.apply_async(neuron_run, args = (N,))
w.append(pool_result.get())
pool.close()
pool.join()
for i in w:
print(i)

由于以下行,两者都应返回相同的wnp.random.seed(0)。但事实并非如此。

错误在哪里?我无法发现它。

seed强制"随机"结果具有可重复性,是的。

但是,如果您并行运行多个进程,则每个进程都有自己的种子值和随机值。

例如,如果具有seed的单进程代码生成以下六个"随机"值:5、6、7、8、9、10,则在六个进程中并行执行一个random将只生成每个进程中的第一个值 (5(。同样,在三个进程中执行两个random调用将在每个进程中生成"随机"值 5 和 6。

换句话说,不要指望random.seed在多个进程中做你想做的事。那永远行不通。

相关内容

  • 没有找到相关文章

最新更新