/* 神経回路網を使って認識を行うプログラム NNrecog.c */ #include #include #include #include #include "myNN.h" /* for get_data( ) */ void calc_hidden_and_output_units( ) /* 現在の入力に対して中間層,出力層のユニットの状態を求める */ /* このルーチンの前に input_unit[ ] に現在の入力を代入する */ { int i, j; /* ループ変数 */ double sum; /* 重み付出力の和 */ /* 隠れ層の各ユニットを状態遷移させる */ input_unit[num_input-1] = 1.0; /* しきい値設定ユニット */ for (i = 0; i < num_hidden-1; i++) { sum = 0.0; for (j = 0; j < num_input; j++) sum = sum + input_unit[j] * wght_in_hid[j][i]; hidden_unit[i] = 1.0 / (1.0 + exp(-sum)); } hidden_unit[num_hidden-1] = 1.0; /* しきい値設定ユニット */ /* 出力層の各ユニットを状態遷移させる */ for (i = 0; i < num_output; i++) { sum = 0.0; for (j = 0; j < num_hidden; j++) sum = sum + hidden_unit[j] * wght_hid_out[j][i]; output_unit[i] = 1.0 / (1.0 + exp(-sum)); } } void load_NN_data( ) /* 神経回路網の結合荷重のデータをファイルから読み込む. */ { char file_name[256]; /* 入力ファイル名を代入する文字列 */ FILE *fp; /* ファイルポインタ */ float f; /* 作業変数 */ int i, j; /* 制御変数 */ /* 入力ファイルのオープン */ printf("Let's input a set of NN parameters\n"); printf("Parameter filename (*.nn) : "); /* 拡張子 = .nn としている */ scanf("%s", file_name); fp = fopen(file_name, "r"); if (NULL == fp) { printf("The file doesn't exist!!!\n"); exit(1); } fscanf(fp, "%d %d %d", &num_input, &num_hidden, &num_output); for (i = 0; i < num_input; i++) for (j = 0; j < num_hidden; j++) { fscanf(fp, "%f", &f); wght_in_hid[i][j] = f; } for (i = 0; i < num_hidden; i++) for (j = 0; j < num_output; j++) { fscanf( fp, "%f", &f ); wght_hid_out[i][j] = f; } fclose(fp); printf("Input is successful.\n\n"); } void calculation( ) /* 未知信号のデータをキーボードから読み込み結果を求めて表示する */ { int i, j; /* ループ変数 */ int num; /* 入力ユニット数 */ printf("Number of bits in a test string = %d\n", num_input-1); /* 未知信号の読み込み */ while (1) { printf("\nInput test data of bit string\n"); for (i = 0; i < num_input-1; i++) { printf("%d-th bit : ", i+1); scanf("%d", &num); if (num == 0) input_unit[i] = 0.1; else input_unit[i] = 0.9; } input_unit[num_input-1] = 1.0; /* しきい値設定ユニット */ /* 中間,出力ユニットの状態遷移 */ calc_hidden_and_output_units( ); printf(" ---> "); for (j = 0; j < num_output; j++) { if (output_unit[j] >= 0.9) printf("1"); else if (output_unit[j] <= 0.1) printf("0"); else printf("*"); } printf("\n"); } } main( ) { load_NN_data( ); /* 結合荷重データの読み込み */ calculation( ); /* 未知信号を読み込んで随時出力 */ return 0; }