質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

0回答

193閲覧

C言語での機械学習による結果の精度が上がらないことについて

iyuto

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/12/13 12:20

前提・実現したいこと

初めまして.
現在,C言語を使用してニューラルネットワークを作成しています.
学習にはバックプロパゲーション法を用いております.
入力データtrain_x[DETASET][INPUTNO+1],教師データd[DETASET][OUTPUTNO]を使用して,学習しましたが値が収束していきません.また,時々下記のエラーが表示されます.下記のソースコードに間違い等あればご指摘承りたいと思います.

発生している問題・エラーメッセージ

Abort trap: 6

該当のソースコード

C

1#include <stdio.h> 2#include <math.h> 3#include <time.h> 4#include <stdlib.h> 5 6#define DETASET 5 7#define INPUTNO 5 //入力層 8#define HIDDENNO 3 //中間層 9#define OUTPUTNO 5 //出力層 10#define SEED 65535 //乱数 11#define EPOCH 10000 //学習回数 12#define ALPHA 0.01 //学習係数 13 14/*******************/ 15/* sigmoid()関数 */ 16/* シグモイド関数 */ 17/*******************/ 18double sigmoid(double u) { 19 return (double)1.0/((double)1.0+exp(-u)) ; 20} 21 22/*******************/ 23/* d_sigmoid()関数 */ 24/*シグモイド関数の派生*/ 25/*******************/ 26double d_sigmoid(double x) { 27 return x*((double)1.0-x); 28} 29 30//*********************/ 31/* initwh()関数 */ 32/* 中間層の重みの初期化 */ 33/**********************/ 34void initwh(double wh[HIDDENNO][INPUTNO+1]) 35{ 36 int i,j ;//繰り返しの制御 37 38 //乱数による重みの決定 39 for(i=0;i<HIDDENNO;++i) 40 for(j=0;j<INPUTNO+1;++j) 41 42 wh[i][j]=((double)rand() / ((double)RAND_MAX + 1)); 43} 44 45/**********************/ 46/* initwo()関数 */ 47/* 出力層の重みの初期化*/ 48/**********************/ 49void initwo(double wo[OUTPUTNO][HIDDENNO+1]) 50{ 51 int i,j ;//繰り返しの制御 52 53 //乱数による重みの決定 54 for(i=0;i<OUTPUTNO;++i) 55 for(j=0;j<HIDDENNO+1;++j) 56 57 wo[i][j]=((double)rand() / ((double)RAND_MAX + 1)); 58} 59 60int main(void) { 61 //乱数の初期化 62 63 srand((unsigned)time(NULL)); 64 65//train data 66 double train_x[DETASET][INPUTNO+1] = {{-9.75,0.75,0,-1,2,1},{0.375,1,-0.375,0.5,0.125,1},{2,4,26,-5,-5,1},{-0.6,-0.3,0.4,0.4,0.1,1},{0.53125,-0.46875,0.4375,0.59375,-0.25,1}}; 67 double d[DETASET][OUTPUTNO] = {{1,1,1,1,1},{1,0,0,1,1},{1,1,1,1,1},{0,1,1,1,0},{1,1,1,1,0}}; 68//net 69 double wh[HIDDENNO][INPUTNO+1]; 70 double wo[OUTPUTNO][HIDDENNO+1]; 71 double y[DETASET][HIDDENNO+1]; 72 double z[DETASET][OUTPUTNO]; 73 74//other 75 int i, j, k, l, n; 76 double sum = 0; 77 78//重みの初期化 79 initwh(wh); 80 initwo(wo); 81 82//tain 83 for(k=0; k<EPOCH; k++) { 84//フィードフォワード 85 for(j=0; j<DETASET; j++) { 86//中間層 87 for(l=0; l<HIDDENNO; l++) { 88 for(i=0; i<INPUTNO+1; i++) { 89 sum += train_x[j][i] * wh[l][i]; 90 } 91 y[j][l] = sigmoid(sum); 92// printf("%f ",y[j][l]); 93 sum = 0; 94 } 95 96 y[j][HIDDENNO] = (double)1.0; 97//出力層 98 for(n=0; n<OUTPUTNO; n++) { 99 for(i=0; i<HIDDENNO+1; i++) { 100 sum += y[j][i] * wo[n][i]; 101 } 102 z[j][n] = sigmoid(sum); 103 sum = 0; 104 } 105 106 107 108//バックワード 109//出力層 110for(i=0; i<OUTPUTNO; i++) { 111 for(n=0; n<HIDDENNO+1; n++) { 112 113 wo[n][i] = wo[n][i] - ALPHA * y[j][i] * d_sigmoid(z[n][j]) * (z[n][j] - d[j][n]); 114// printf("\n重みwo[%d][%d]:%f ", n,i,wo[n][i]); 115 } 116//printf("\n"); 117 } 118 119 120//中間層 121 for(l=0; l<HIDDENNO; l++) { 122 for(i=0; i<INPUTNO+1; i++) { 123 124 wh[i][l] = wh[i][l] - ALPHA * train_x[j][l] * d_sigmoid(y[j][i]) * d_sigmoid(z[n][j]) * (z[n][j] - d[j][n]) * wo[n][i]; 125//printf("\n重みwh[%d][%d]:%f ", i,l,wh[i][l]); 126 } 127 // printf("\n"); 128 } 129 } 130//結果の出力 131 132 printf("\nz=\n"); 133 for (n = 0; n < DETASET; n++) { 134 for(i=0; i<OUTPUTNO; i++) { 135 printf("%f ", z[n][i]); 136 } 137 printf("\n"); 138 } 139 printf("EPOCH:%d\n",k); 140 } 141 142//predict 143 for(j=0; j<DETASET; j++) { 144//中間層 145 for(l=0; l<HIDDENNO; l++) { 146 for(i=0; i<INPUTNO+1; i++) { 147 sum += train_x[j][i] * wh[l][i]; 148 } 149 y[j][l] = sigmoid(sum); 150 sum = 0; 151 } 152 y[j][HIDDENNO] = (double)1.0; 153//出力層 154 for(n=0; n<OUTPUTNO; n++) { 155 for(i=0; i<HIDDENNO+1; i++) { 156 sum += y[j][i] * wo[n][i]; 157 } 158 z[j][n] = sigmoid(sum); 159 sum = 0; 160 } 161 162 } 163 164//学習結果の出力 165 printf("結果:\n"); 166 for (n = 0; n < DETASET; n++) { 167 printf("データ%d: ",n); 168 for(i=0; i<OUTPUTNO; i++) { 169 printf("%f ", z[n][i]); 170 } 171 printf("\n"); 172 } 173 printf("学習回数:%d\n",k); 174 175 return 0; 176} 177

試したこと

学習率,学習回数,データの変更

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwanote

2018/12/13 18:18

z[n][j]となっていたりz[j][n]となっていたりしますが大丈夫ですか?
iyuto

2018/12/13 21:12

ありがとうございます,確認してみたいと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問