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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

349閲覧

javaのニューラルネットワーク3層パーセプトロン

riririra

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/05/13 13:33

###質問内容
javaを使った3層ニューラルネットワークを構築していますが出力の値がおかしくなってしまいそれにより誤差もおかしくなり一応の収束はするのですが正答率が低いモノとなってしまいます
コードのどこが問題かわからず質問させてもらいました。
###コード

Java

1 //終了条件 2 double ipusiron = 0.001; 3 //入力数 4 int n = 19; 5 //隠れ層の数 6 int m = 5; 7 //出力 8 int l = 3; 9 //データ数 10 int num =27; 11//シグモイド関数 12 double sigumoido; 13 sigumoido = 1/1 + Math.pow(Math.E,-1); 14//重みの初期値 15 for( i = 0; i < n - 1; i++){ 16 for( j = 1; j < m; j++){ 17 w[i][j] = 0.1; 18 } 19 } 20 for( j = 0; j < m; j++){ 21 for( k = 1; k < l; k++){ 22 v[j][k] = 0.1; 23 } 24 } 25//入力 26 double X[][]; 27//正解のセット 28 double d[][]; 29//学習 30while(E >= ipusiron){ 31//出力リセット 32 for(X1 = 0; X1 < num; X1++){ 33 for(k = 0; k < l; k++){ 34 hk[X1][k] = 0; 35 } 36 } 37//ここから計算 38 for(x1 = 0; x1 < num; x1++){ 39//X[num][n]の中身を格納 40 for(x2 = 0; x2 < n-1; x2++){ 41 feature[x2] = X[x1][x2]; 42 } 43//隠れ素子の出力を求める 44 for(j =1;j<m;j++){ 45 for(x2 =0; x2 < n - 1; x2++){ 46 fj[x1][j] += w[x2][j]*feature[x2]; 47 } 48 fj[x1][j] += w[0][j]; 49 fj[x1][j] = sigumoido * fj[x1][j]; 50 } 51//出力素子の出力を求める 52 for(k = 0; k < l; k++){ 53 for(j = 0; j < m; j++){ 54 hk[x1][k] += v[j][k] * fj[x1][j]; 55 } 56 hk[x1][k] = hk[x1][k] + v[0][k]; 57 hk[x1][k] = sigumoido * hk[x1][k]; 58 } 59//修正誤差を求める 60 sanogoukei = 0; 61 for(j = 1; j < m; j++){ 62 for(k = 1; k < l; k++){ 63 delta2[x1][k] = (hk[x1][k] - d[x1][k]) 64 * hk[x1][k] 65 * (1-hk[x1][k]); 66 } 67 68 for(k = 1; k < l; k++){ 69 SIGUMAdelta2 += delta2[x1][k] * v[j][k]; 70 71 } 72 delta1[x1][j] = SIGUMAdelta2 * fj[x1][j] 73 * (1 - fj[x1][j]); 74 75 SIGUMAdelta2 = 0; 76 } 77//重み修正の最大値delta_maxを求める 78 double delta_max = 0; 79 for(X1 = 0;X1 < num; X1++){ 80 fj[X1][0] = 1; 81 } 82//Vjk 83 for(j = 0;j<m;j++){ 84 for(k=1;k<l;k++){ 85 deltaV[j][k] += delta2[x1][k] * fj[x1][j]; 86 if(deltaV[j][k] > delta_max){ 87 delta_max = deltaV[j][k]; 88 } 89 } 90 } 91//Wij 92 for(i = 0; i < n - 1; i++){ 93 for(j = 0;j<m;j++){ 94 deltaW[i][j] += delta1[x1][j] * feature[i]; 95 if(deltaW[i][j] > delta_max){ 96 delta_max = deltaW[i][j]; 97 } 98 } 99 } 100//time = 0.1 101 delta = time/delta_max; 102//重みの更新 103 for(j = 0;j<m;j++){ 104 for(k = 1; k < l; k++){ 105 v[j][k] = v[j][k] - delta * deltaV[j][k]; 106 } 107 } 108 for( i = 0; i < n - 1 ; i++){ 109 for( j = 1; j < m; j++){ 110 w[i][j] = w[i][j] - delta * deltaW[i][j]; 111 } 112 } 113 }//for(x1 = 0; x1 < num; x1++) 114 115//誤差の計算 116E = 0; 117 for(X1 = 0; X1 < num; X1++){ 118 for(k = 1; k < l; k++){ 119 gosa = hk[X1][k] - d[X1][k]; 120 gosa = Math.pow(gosa, 2); 121 } 122 gosa = 0; 123 } 124 E = 1.0 / (2 * n-1) * E; 125}//while(E >= ipusiron) 126

###出力(最終的なhk[num][l]の中身)
0.0
52.3957068057971
8.700271583398967

0.0
48.27491048001723
8.014032345204052
1

0.0
48.930419819803085
8.117433543441596

0.0
45.878823843881165
7.609130343072176

0.0
26.430757542424388
4.397580242793037

0.0
47.716896708863565
7.903124926271077

0.0
31.068050591827877
5.156303364194832

0.0
44.153728511903495
7.307359602475295

0.0
47.893902095154594
7.918382861703904

0.0
41.56291579336123
6.8728580589037005

0.0
41.581790522937055
6.871964727776629

0.0
25.186943791913674
4.175545385559397

0.0
23.714109897044633
3.9313972283105834

0.0
23.697277382466666
3.9263564485921427

0.0
52.8126101726759
8.696950543684412

0.0
29.246170566475637
4.830993883972675

0.0
44.650085656316286
7.350529271353912

0.0
44.14167602257152
7.2631707905116105

0.0
43.61061424748054
7.172221229123673

0.0
51.50007004329875
8.457809439640187

0.0
53.107583544353055
8.715773852424826

0.0
25.79998076815934
4.252286337267481

0.0
42.940534996673996
7.047241584036438

0.0
41.74210378336586
6.8479962382230335

0.0
61.591296309073705
10.080033339472793

0.0
38.16786464637572
6.258650329871518

0.0
38.53740449580547
6.3158049507619785

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

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

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

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

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

guest

回答2

0

自己解決

反応の方遅くなってしまってすみません
自己解決しました

完全にこちらの勘違いでした
シグモイド関数の使い方をわかっていなかったせいです
sigumoido = 1/1 + Math.pow(Math.E,-1);
として定数をいれてましたけどこれ重みや出力の総和を入力として使うことで0~1の範囲に値を正規化するためのものだったんですね

投稿2018/05/24 01:37

riririra

総合スコア12

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

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

0

パーセプトロンには局所的最適値に収束してしまう欠点があります。もしかして単純に局所的最適値に収束してしまっているだけではないでしょうか?初期値を0.1固定ではなく、ランダムな値にして試行を繰り返せば正答率向上しませんか?

投稿2018/05/14 06:07

Kunihiro_Narita

総合スコア472

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問