Skip to content

Instantly share code, notes, and snippets.

@KUKDfhia
Created July 19, 2017 12:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KUKDfhia/620f995d7e126536e27c936e7e3f2fd2 to your computer and use it in GitHub Desktop.
Save KUKDfhia/620f995d7e126536e27c936e7e3f2fd2 to your computer and use it in GitHub Desktop.
/* プログラム名: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