簡単のため入力、出力とも一個しかない場合を考えます。
(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) |