• 締切済み

4階層型ニューラルネット(逆伝播法)

 現在、実験のために4階層型のニューラルネットを作成しているのですが上手く収束しません。使用は入力層、中間層2層、出力層の計4層です。  各変数はo1が入力ユニットからの出力、o2とo3は中間層ユニットの出力、o4が出力層ユニットの出力です。w43,w32,w21はそれぞれの結合強度です。biasはそのままバイアスです。変数の前にdがついてるものは変化を表したものです。etaは学習率、alphaは慣性項係数です。この値と中間層ユニット数を変更してみても収束しませんでした。  問題があるのは逆伝播法での結合強度の更新です。以下にそのルーチンを示しますのでお気づきの点がありましたらお願いします。特に問題があるのは中間層~入力層間についてだと思うのですが。。  ご意見お願いします。また、よろしければ4層以上のニューラルネットについてのサイトがあればお願いします。

みんなの回答

  • eh02m031
  • ベストアンサー率0% (0/0)
回答No.1

上の質問のプログラムです。 void Bprop(p) int p; { int i,j,k,l; /*loop counter*/ double d2[nnuni],d3[nnuni2],d4[out]; /*temp*/ double sum[nnuni2],sum2[nnuni]; for(k=0;k<nnuni2;k++){ sum[k]=0.0; for(l=0;l<out;l++){ d4[l] = (t[p][l]-o4[l])*o4[l]*(1-o4[l]); dw43[l][k] = eta*d4[l]*o3[k] + alpha*dw43[l][k]; w43[l][k] += dw43[l][k]; sum[k] += d4[l]*w43[l][k]; } } for(l=0;l<out;l++){ dbias4[l] = eta*d4[l] + alpha*dbias4[l]; bias4[l] += dbias4[l]; } for(j=0;j<nnuni;j++){ sum2[j] = 0.0; for(k=0;k<nnuni2;k++){ d3[k] = o3[k]*(1-o3[k])*sum[k]; dw32[k][j] = eta*d3[k]*o2[j] + alpha*dw32[k][j]; w32[k][j] += dw32[k][j]; sum2[j] += d3[k]*w32[k][j]; } } for(k=0;k<nnuni2;k++){ dbias3[k] = eta*d3[k] + alpha*dbias3[k]; bias3[k] += dbias3[k]; } for(i=0;i<in;i++){ for(j=0;j<nnuni;j++){ d2[j] = o2[j]*(1-o2[j])*sum2[j]; dw21[j][i] = eta*d2[j]*o1[p][i] + alpha*dw21[j][i]; w21[j][i] += dw21[j][i]; } } for(j=0;j<nnuni;j++){ dbias2[j] = eta*d2[j] + alpha*dbias2[j]; bias2[j] += dbias2[j]; } }

関連するQ&A