前提・実現したいこと
パーセプトロンを使い論理回路の学習を行った後に
CSVファイルを読み込み、それをパーセプトロンに(fname1:学習用データ)インプット及び学習させ、その後
別のCSVファイル(fname2:教師データ)を使い正答率を確認するプログラムを作成中にCSVのデータを配列に格納出来ていないが発生しました。
発生している問題・エラーメッセージ
(ソースコード後半のsrand()以降のteacher部分において) CSVファイル読み込み自体は行えても、配列に格納すら出来ていないので、その方法。
該当のソースコード
C言語
1#include<stdio.h> 2#include<stdlib.h> 3#include<time.h> 4#include<math.h> 5 6#define INPUTSIZE 2 7 8 9#define LOOPNUM 10 10 11 12double Forward(double *input, int ni, double wio[ni]); 13int Backward(double *input, double output, int ni, 14 double wio[ni], double eta, double teacher); 15 16 17 18 19double Forward(double *input, int ni, double wio[ni]) 20{ 21 double sum = 0.0; 22 int i = 0; 23 double thata = 0.1; 24 for(i = 0;i<=ni;i++) 25 sum+=input[i]*wio[i]; 26 if (sum > thata)return 1; 27 else return 0; 28//�����菇���ɏ]���R�[�f�B���O���s������ 29} 30 31int Backward(double *input, double output, int ni, 32 double wio[ni], double eta, double teacher) 33{ 34 int i = 0; 35 for (i = 0;i <= ni;i++) 36 wio[i] += eta * (teacher - output)*input[i]; 37 return 0; 38//�����菇���ɏ]���R�[�f�B���O���s������ 39} 40 41//AND 42double teacher[4][3] = { 43 {0., 0., 0.}, 44 {1., 0., 0.}, 45 {0., 1., 0.}, 46 {1., 1., 1.} 47}; 48 49//OR 50/*double teacher[4][3] = { 51 {0., 0., 0.}, 52 {1., 0., 1.}, 53 {0., 1., 1.}, 54 {1., 1., 1.} 55};*/ 56 57//XOR 58/*double teacher[4][3] = { 59 {0., 0., 0.}, 60 {1., 0., 1.}, 61 {0., 1., 1.}, 62 {1., 1., 0.} 63};*/ 64 65 66 67int main(int argc, char *argv[],double teacher) 68{ 69 double input[INPUTSIZE], output; 70 double weight_io[INPUTSIZE]; 71 double rms=0.; 72 int i, j,i_rms=0; 73 int *j = 74 FILE *fp; 75 char *fname1 = "learning1.csv"; 76 float n1, n2; 77 int ret, n3; 78 79 fp = fopen(fname1, "r"); 80 if (fp == NULL) { 81 printf("%sファイルが開けません¥n", fname1); 82 return -1; 83 } 84 85 while ((ret = fscanf(fp, "%f,%f,%d", &n1, &n2, &n3)) != EOF) { 86 printf("%f %f %d\n", n1, n2, n3); 87 } 88 89 char *fname2 = "test1.csv"; 90 float m1, m2; 91 int let, m3; 92 93 fp = fopen(fname2, "r"); 94 if (fp == NULL) { 95 printf("%sファイルが開けません¥n", fname2); 96 return -1; 97 } 98 99 while ((let = fscanf(fp, "%f,%f,%d", &m1, &m2, &m3)) != EOF) { 100 printf("%f %f %d\n", m1, m2, m3); 101 } 102 fclose(fp); 103 104 srand(1); 105 106 for(i=0; i<INPUTSIZE; i++) 107 { 108 weight_io[i] = ((double)rand()/RAND_MAX)/10; 109 } 110 for(i=0; i<LOOPNUM; i++){ 111 for (j = 0; j < 4; j++) { 112 input[0] = teacher[j][0]; 113 input[1] = teacher[j][1]; 114 output = Forward(input, INPUTSIZE, weight_io); 115 Backward(input, output, INPUTSIZE,weight_io, 0.01, teacher[j][2]); 116 } 117 } 118 119 120 for(i=0; i<=1; i++){ 121 for(j=0; j<=1; j++){ 122 input[0] = i; 123 input[1] = j; 124 output=Forward(input, INPUTSIZE, weight_io); 125 rms+=(teacher[i*(2)+j][2]-output)*(teacher[i*(2)+j][2]-output); 126 i_rms++; 127 printf("INPUT: %d %d OUTPUT: %f %f\n", i, j,output,(teacher[i*(2)+j][2])); 128 } 129 } 130 131 printf("LOOPNUM:%d RMS:%f\n",LOOPNUM,sqrt(rms)/i_rms); 132 133 134 return 0; 135} 136 137 138
試したこと
teacherの後が宣言されていないと考え、int[]などでポインタを作成しようとしましたがダメでした。
補足情報(FW/ツールのバージョンなど)
作成はVS code,コンパイルなどは仮想LinuxのC言語で行っています。
コンパイルエラーが出て実行できません.
まずはコンパイルできるコードに修正願えますか.
回答2件
あなたの回答
tips
プレビュー