为什么多重处理会产生除常规功能以外的其他结果?

时间:2019-04-09 10:42:37

标签: python python-3.x neural-network multiprocessing

我想使我的NN的学习过程更短,所以我正在使用多处理。但是,获得的结果是错误的-网络无法正确学习(在使用相同功能但未进行多处理时正在学习)。我有两个问题。首先-如果我引入一些变量并将其用于通过多处理实现的函数中,则可以正常工作。问题是,当我运行代码后,我手动更改了变量(例如>>> a + = 10),多重处理中的函数看不到任何更改。它就像在开始时一样运行。第二个问题-在每次运行函数时都强制在内部输入“新”数据后,结果仍然不正确。我(另一个)问题是,某些初始权重和偏差太大或太小,其值的微小变化不会影响全局结果。因此,某些输出梯度应为0,这在运行训练而不进行多处理的情况下是正确的。当我使用多重处理进行训练时,每个梯度都是0形式的,它们不是一个结果的副本。我的想法不多了,可能是什么问题,请您帮忙。

这是我运行multiTrain()的代码:

def calcGradM(data):

    print(data[0])
    VC=-epsilon/score0
    for i in data:

        if i[2]==1:
            deltaMaskWB1[i[3]][0][i[4]]=i[0]*VC
            deltaMaskWB1[i[3]][1][i[4]]=i[1]*VC
        if i[2]==2:
            deltaMaskWB2[i[3]][0][i[4]]=i[0]*VC
            deltaMaskWB2[i[3]][1][i[4]]=i[1]*VC

def Grad(score0,lvl,layer,i):

    maskW1=np.zeros_like(wb1)
    maskW2=np.zeros_like(wb2)
    maskB1=np.zeros_like(wb1)
    maskB2=np.zeros_like(wb2)

    if layer==1:
        maskW1[lvl][0][i]=epsilon
        maskB1[lvl][1][i]=epsilon
    if layer==2:
        maskW2[lvl][0][i]=epsilon
        maskB2[lvl][1][i]=epsilon

    return([result(wb1+maskW1,wb2+maskW2)- 
score0,result(wb1+maskB1,wb2+maskB2)-score0,layer,lvl,i])

def result(L1,L2):
    ans=[]
    for i in range(pos1,pos2):
        ans.append(netResponse(L1,L2,i))
    return np.sum(ans)

def multiTrain():
    T0=time.time()
    global score0
    score0=result(wb1,wb2)
    if __name__ == '__main__':
        pool = multiprocessing.Pool(4)
        for l in range(2):
            calcGradM(pool.map(partial(Grad,score0,l,2), range(hidLen)))
        for l in range(hidLen):
            calcGradM(pool.map(partial(Grad,score0,l,1), range(len(neuronsIn))))
        pool.close()
    print(time.time()-T0)

1 个答案:

答案 0 :(得分:0)

在多进程的父级和子级之间读写不会隐式共享变量。

特别是,如果它们的值在父级中发生更改,则不会将这些值隐式传递给子级,或者,如果子项更改了值,则不会将其传播到其他进程。

孩子可能会(取决于生成模式)在从父进程分叉时继承全局变量的状态,但是您不应该依赖于此。

multiprocessing手册中有关于sharing state between processes的部分。

This article也可能会为您提供帮助。