-
-
Save KUKDfhia/620f995d7e126536e27c936e7e3f2fd2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* プログラム名:neuralfuture.c */ | |
/* copyright "© 2017 KUKDfhia." */ | |
/* link "http://qiita.com/KUKDfhia" */ | |
#include<stdio.h> | |
#include<stdlib.h> | |
#include<math.h> | |
#include<time.h> | |
/* neurallearn.cで用いた入力層、中間層、出力層の値を設定する */ | |
#define NUM_INPUT 4 /* 入力層の数(7セグメント表示器の入力)*/ | |
#define NUM_HIDDEN_ONE 12 /* 中間層1の数(自由)*/ | |
#define NUM_HIDDEN_TWO 10 /* 中間層2の数(自由)*/ | |
#define NUM_HIDDEN_THREE 8 /* 中間層3の数(自由)*/ | |
#define NUM_OUTPUT 7 /* 出力層の数(7セグメント表示器の出力)*/ | |
/* シグモイド関数 */ | |
double sigmoid(double x){ | |
double f; | |
f=1.0/(1.0+exp(-x)); | |
return f; /* 戻す値が関数値 */ | |
} | |
double x[NUM_INPUT+1],h1[NUM_HIDDEN_ONE+1],h2[NUM_HIDDEN_TWO+1],h3[NUM_HIDDEN_THREE+1],y[NUM_OUTPUT]; /* xが入力、h1が中間1、h2が中間2、h3が中間3、yが出力 それぞれニューロンの値。+1は閾値表現用 */ | |
int main(void){ | |
int i,j; | |
double net_input; | |
double tx[1][NUM_INPUT]; | |
double w1[NUM_INPUT+1][NUM_HIDDEN_ONE],w2[NUM_HIDDEN_ONE+1][NUM_HIDDEN_TWO],w3[NUM_HIDDEN_TWO+1][NUM_HIDDEN_THREE],w4[NUM_HIDDEN_THREE+1][NUM_OUTPUT]; /* w1が入力ー中間1、w2が中間1ー中間2、w3が中間2ー中間3、w4が中間3ー出力の結合荷重の値 */ | |
FILE *csv; | |
/* neurallearn.cで得られた結合荷重の値をw1,w2,w3,w4に設定する */ | |
/* kekka1.csvファイルのデータを結合荷重w1に設定 */ | |
csv=fopen("kekka1.csv", "r"); | |
if(csv==NULL){ | |
printf("ファイルがオープンできません\n"); | |
return -1; | |
} | |
for(i=0;i<NUM_INPUT+1;i++){ | |
for(j=0;j<NUM_HIDDEN_ONE;j++){ | |
if(fscanf(csv,"%lf",&w1[i][j])!='\0'); | |
} | |
} | |
fclose(csv); | |
/* kekka2.csvファイルのデータを結合荷重w2に設定 */ | |
csv=fopen("kekka2.csv", "r"); | |
if(csv==NULL){ | |
printf("ファイルがオープンできません\n"); | |
return -1; | |
} | |
for(i=0;i<NUM_HIDDEN_ONE+1;i++){ | |
for(j=0;j<NUM_HIDDEN_TWO;j++){ | |
if(fscanf(csv,"%lf",&w2[i][j])!='\0'); | |
} | |
} | |
fclose(csv); | |
/* kekka3.csvファイルのデータを結合荷重w3に設定 */ | |
csv=fopen("kekka3.csv", "r"); | |
if(csv==NULL){ | |
printf("ファイルがオープンできません\n"); | |
return -1; | |
} | |
for(i=0;i<NUM_HIDDEN_TWO+1;i++){ | |
for(j=0;j<NUM_HIDDEN_THREE;j++){ | |
if(fscanf(csv,"%lf",&w3[i][j])!='\0'); | |
} | |
} | |
fclose(csv); | |
/* kekka4.csvファイルのデータを結合荷重w4に設定 */ | |
csv=fopen("kekka4.csv", "r"); | |
if(csv==NULL){ | |
printf("ファイルがオープンできません\n"); | |
return -1; | |
} | |
for(i=0;i<NUM_HIDDEN_THREE+1;i++){ | |
for(j=0;j<NUM_OUTPUT;j++){ | |
if(fscanf(csv,"%lf",&w4[i][j])!='\0'); | |
} | |
} | |
fclose(csv); | |
/* 入力値設定 */ | |
printf("入力値を設定してください\n"); | |
for(i=0;i<1;i++){ | |
for(j=0;j<NUM_INPUT;j++){ | |
printf("x[%d]=",j); | |
scanf("%lf",&tx[i][j]); | |
} | |
} | |
printf("\n"); | |
/* 順方向の動作 */ | |
/* ネットワークへの入力設定 */ | |
for(i=0;i<NUM_INPUT;i++){ | |
x[i]=tx[0][i]; | |
} | |
/* 閾値設定x */ | |
x[NUM_INPUT]=(double)1.0; | |
/* 隠れ素子1の計算 */ | |
for(j=0;j<NUM_HIDDEN_ONE;j++){ | |
net_input=0; | |
for(i=0;i<NUM_INPUT+1;i++){ | |
net_input=net_input+w1[i][j]*x[i]; | |
} | |
/* シグモイドの適用 */ | |
h1[j]=sigmoid(net_input); | |
} | |
/* 閾値設定h1 */ | |
h1[NUM_HIDDEN_ONE]=(double)1.0; | |
/* 隠れ素子2の計算 */ | |
for(j=0;j<NUM_HIDDEN_TWO;j++){ | |
net_input=0; | |
for(i=0;i<NUM_HIDDEN_ONE+1;i++){ | |
net_input=net_input+w2[i][j]*h1[i]; | |
} | |
/* シグモイドの適用 */ | |
h2[j]=sigmoid(net_input); | |
} | |
/* 閾値設定h2 */ | |
h2[NUM_HIDDEN_TWO]=(double)1.0; | |
/* 隠れ素子3の計算 */ | |
for(j=0;j<NUM_HIDDEN_THREE;j++){ | |
net_input=0; | |
for(i=0;i<NUM_HIDDEN_TWO+1;i++){ | |
net_input=net_input+w3[i][j]*h2[i]; | |
} | |
/* シグモイドの適用 */ | |
h3[j]=sigmoid(net_input); | |
} | |
/* 閾値設定h3 */ | |
h3[NUM_HIDDEN_THREE]=(double)1.0; | |
/* 出力素子の計算 */ | |
printf("出力値は次のようになります\n"); | |
for (j=0;j<NUM_OUTPUT;j++){ | |
net_input=0; | |
for(i=0;i<NUM_HIDDEN_THREE+1;i++){ | |
net_input=net_input+w4[i][j]*h3[i]; | |
} | |
/* シグモイドの適用 */ | |
y[j]=sigmoid(net_input); | |
printf("y[%d] > %.3lf\n",j,y[j]); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment