我想使我的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)
答案 0 :(得分:0)
在多进程的父级和子级之间读写不会隐式共享变量。
特别是,如果它们的值在父级中发生更改,则不会将这些值隐式传递给子级,或者,如果子项更改了值,则不会将其传播到其他进程。
孩子可能会(取决于生成模式)在从父进程分叉时继承全局变量的状态,但是您不应该依赖于此。
multiprocessing
手册中有关于sharing state between processes的部分。
This article也可能会为您提供帮助。