次へ: 双曲線関数について
上へ: ニューラルネットの基本:実習編
戻る: セルフフィードバックつきのモデル
隠れニューロンがあるもの、2 つのニューロンが相互に結合したもの、
さらに、フィードバックがあるものが考えられる。
図 3:
隠れニューロン(外部からの入力、外部への出力が無いニューロンがある場合)
|
|
図 5:
さらに self feedback loop がある場合
|
|
課題 4:
どれか一つのプログラムを作り、結合係数の変化が出力値に与える影響を考察しなさい。
--ヒント--
ここでは Figure.4 の場合を取り上げてみます。
後で使うので、ニューロンを表現する構造体の定義を次のようにしておきます。
struct NEURON {
double output, old_output;
double thres;
int Ninp;
double *inp_wgt;
struct NEURON **inp_neuron;
};
typedef struct NEURON neuron;
ここで、Ninp という int 型の変数を加えました。このニューロンが
いくつのニューロンからの入力を受けるかを表します。加えて、
struct NEURON **inp_neuron; というこのニューロンに対して出力を送っている
ニューロンへのポインタを格納するためのポインタ(配列)を用意しておきます。
一つのニューロンを初期化する関数内では
void initialize_neuron(neuron *a, int N)
{
int i;
a->Ninp = N;
a->inp_wgt = (double *)malloc(sizeof(double) * (N+1));
for (i=0; i<=N; i++) {
a->inp_wgt[i] = drand2();
}
a->inp_neuron = (neuron **)malloc(sizeof(neuron *) * (N+1));
}
のように、入力を受けるニューロン数だけ結合係数とそのニューロンの定義されている
場所を格納しておくための場所を malloc() 関数を使って確保することにします。
このようにしておくと、ニューロン数がいくつになっても対応できます。
ポインタへのポインタと、メモリの動的割り当て(malloc())と、定義済変数のサイズを
計算するための sizeof などすこし分かりづらいかも知れませんが、この方が
拡張性が高いといえます。このようにしておけば、ニューロン a とニューロンb
との相互結合を次のように表現できます。
Neuron a,b;
initialize_neuron(&a, 2);
initialize_neuron(&b, 2);
a.inp_neuron[1] = &b;
b.inp_neuron[1] = &a;
Shinichi ASAKAWA
平成14年4月30日