簡単のため入力、出力とも一個しかない場合を考えます。
![]() |
(1) |
このニューロンへの入力
が
から
まで変化したときに出力が
どのように変化するかを出力する program を書いてみましょう。
C の場合、一つのニューロンを一つの構造体で表現することにすれば、
typedef struct {
double output;
double inner_state;
double thres;
double inp_wgt;
} neuron;
neuron という構造体を定義することになります。
このニューロンの出力が次のような sigmoid 関数に従うとすると
| (2) |
double sigmoid(double u) {
return 1.0 / ( 1.0 + exp(- (u)) );
}
入力
を
から
まで変化させるには for 文でも、
while 文でも until 文でよいです。たとえば次のようになるでしょう。
double FROM = -10.0;
double TO = 10.0;
double STEP = 0.01;
x = FROM;
while ( x <= TO ) {
printf("%f\n", /* ここに出力を計算する関数の呼出しが入る */);
x += STEP;
}
本当はこれだけならば、わざわざ C を使うまでもなく、gnuplot や
Mathematica などを用いる方が簡単です。
Excel でも可能で、洒落たグラフも作ってくれますが、
自分でモデルをいじって感覚を掴むためにはやはり
プログラムを書いてみてください。一応正解を挙げておくと、次のようになります。
#include <stdio.h>
#include <math.h>
#define FROM -10.0
#define TO 10.0
#define STEP 0.01
#define sigmoid_slope -1.0
typedef struct {
double output;
double thres;
double inp_wgt;
} neuron;
void initialize_neuron(neuron *x)
{
x->thres = 0.0;
x->inp_wgt = 1.0;
x->output = 0.0;
}
double sigmoid(double value)
{
return 1.0 / ( 1.0 + exp(sigmoid_slope * value) );
}
void update_neuron(neuron *x, double input)
{
x->output = sigmoid(x->inp_wgt * input - x->thres);
}
int main(int argc, char **argv)
{
neuron a;
double x;
initialize_neuron(&a);
x = FROM;
while ( x <= TO ){
update_neuron(&a, x);
printf("%f %f\n", x, a.output);
x += STEP;
}
}
FROM, TO, STEP, sigmoid_slope)、
1 つの構造体(neuron)、
3 つの関数(initialize_neuron(),sigmoid(),main())
が定義されています。
C プログラムの初心者にとって理解しにくい点はおそらく、ニューロンを表す(構造体を
使って定義された)変数 a (main 関数から呼び出された関数
initialize_neuron() と update_neuron()では
x となっている)の前に付いている
* や & の記号の意味
-> と . との違い
* はポインタ, & はアドレス演算子です。
ポインタの理解は C をマスターする上で非常に大切ですので、不安な人は必ず
参考書をあたってください。ここでは、
C の関数呼び出しには
& をつけて関数を呼び出さ
ねばならない、ということを確認してください。
呼び出された関数側では変数はポインタ(*)として参照しなければなりません。
また、構造体の内容を参照するには . でよいのですが、
ポインタとして渡された関数の内部では -> で参照しなければならないという
ことも忘れてはいけません。
あとは、main() 関数から実行が始まることに注意すればプログラムを読むのは
それほど難しいことではないでしょう。
最初なので、コンパイル方法と実行方法を確認しておくと
% gcc -o Neuron Neuron.c -lm % ./Neuronとなります。 ただし、Windows 環境では上記の操作を MS-DOS プロンプトを起動して実行する必要があります。
% ./Neuron > ファイル名とします。
![]() |
(3) |
| (4) |
![]() |
(5) | ||
![]() |
(6) | ||
![]() |
(7) |
![]() |
(8) | ||
![]() |
(9) | ||
| (10) |