2016-10-20 11 views
0

同じ重みとバイアスを持つ2つのネットワークを作成しようとしています。同様の学習曲線が必要です。反復2では、2つのネットワークのすべてのブロブは同じです(データ&差分)が、パラメータ(重みは&のバイアス)が異なります。Pycafe-同じ重みとバイアスを持つ2つのネットワークを作成する

私はここで間違っていますか?

注:ネットワーク内には、データセットとドロップアウトレイヤのシャッフルはありません。

おかげ

solver1 = caffe.SGDSolver('lenet_solver.prototxt') 
solver2 = caffe.SGDSolver('lenet_solver.prototxt') 
solver1.step(1) 
solver2.step(1) 
CopySolver(solver1,solver2) 
for i in range(10): 
    solver1.step(1)  
    solver2.step(1) 
    print solver1.net.params['ip2'][1].diff 
    print solver2.net.params['ip2'][1].diff 

def CopySolver(SolverA,SolverB): 
    params = SolverA.net.params.keys() 
    paramsA = {pr: (SolverA.net.params[pr][0].data,SolverA.net.params[pr][1].data) for pr in params}  
    paramsB = {pr: (SolverB.net.params[pr][0].data,SolverB.net.params[pr][1].data) for pr in params}     
    for pr in params: 
     paramsB[pr][1][...] = paramsA [pr][1] #bias 
     paramsB[pr][0][...] = paramsA [pr][0] #weights 

答えて

0

あなたは良いを行っています。すべての列車は個別です。あなたは2つの同じネットを持ち、それらを同じデータセットで訓練することができますが、各ネットはランダムな場所から始まります。

+0

反復の後に、私はネットワーク2(すべてのバイアス&すべての重量)にネットワーク1のコピーは、初期点は同じです。学習プロセスでは、両方のネットワークのパラメータに違いはないと思います。 –

1

あなたはソルバーの勢いを考慮しませんでした。 1つのソルバオブジェクトから別のソルバオブジェクトにネットパラメータをコピーした後、ソルバ1とソルバ2の間でソルバの運動量情報(SGDなど)は依然として異なります。 "lenet_solver.prototxt"に "momentum:0"を設定すると、予想される動作が得られるはずです。

また、パラメータを保存し、2つの新しいソルバオブジェクトを作成し、パラメータをロードしてトレーニングを再開することもできます。これを行うと、どちらも最初の勢いから始まっていないことが保証されます。 ここでは、このように見える可能性がどのように例:このコードでは

solver1 = caffe.SGDSolver('lenet_solver.prototxt') 
solver2 = caffe.SGDSolver('lenet_solver.prototxt') 
solver1.step(1) 
solver2.step(1) 

solver1.net.save("tmp.caffemodel") 

solver1 = caffe.SGDSolver('lenet_solver.prototxt') 
solver2 = caffe.SGDSolver('lenet_solver.prototxt') 
solver1.net.copy_from("tmp.caffemodel") 
solver2.net.copy_from("tmp.caffemodel") 

for i in range(10): 
    solver1.step(1) 
    solver2.step(1) 
    print solver1.net.params['ip2'][1].diff 
    print solver2.net.params['ip2'][1].diff 
+0

特にErik B.に感謝。 あなたは私の問題を解決しました。 –

関連する問題