OSDN Git Service

隠れ層出力が何気にメソッド呼び出し順序に依存していたので、その依存性を排除しました。
authoru6k <u6k@dd34cd95-496f-4e97-851c-65f59ff6709a>
Sun, 20 Apr 2008 17:17:39 +0000 (17:17 +0000)
committeru6k <u6k@dd34cd95-496f-4e97-851c-65f59ff6709a>
Sun, 20 Apr 2008 17:17:39 +0000 (17:17 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/simplenn/trunk@16 dd34cd95-496f-4e97-851c-65f59ff6709a

simplenn/src/main/java/jp/gr/java_conf/u6k/simplenn/SimpleNN.java
simplenn/src/main/java/jp/gr/java_conf/u6k/simplenn/SimpleNNApplet.java

index 442b3fd..fa265b2 100644 (file)
@@ -144,13 +144,6 @@ public final class SimpleNN {
 \r
     /**\r
      * <p>\r
-     * 隠れ層の出力。\r
-     * </p>\r
-     */\r
-    private double[]            hiddenOut       = new double[SimpleNN.HIDDEN];\r
-\r
-    /**\r
-     * <p>\r
      * ニューラル・ネットワークの状態(閾値、重み)を初期化します。\r
      * </p>\r
      */\r
@@ -186,9 +179,12 @@ public final class SimpleNN {
      * \r
      * @param input\r
      *            入力データ。\r
-     * @return 演算結果。\r
+     * @param output\r
+     *            順方向演算の結果を格納する配列。\r
+     * @param hiddenOutput\r
+     *            順方向演算の過程の隠れ層出力を格納する配列。\r
      */\r
-    public double[] forwardNeuralNet(double[] input) {\r
+    public void forwardNeuralNet(double[] input, double[] output, double[] hiddenOutput) {\r
         double[] out = new double[SimpleNN.OUTPUT];\r
         double[] hidden = new double[SimpleNN.HIDDEN];\r
 \r
@@ -198,19 +194,17 @@ public final class SimpleNN {
             for (int i = 0; i < SimpleNN.INPUT; i++) {\r
                 hidden[j] += input[i] * this.weightInHidden[i][j];\r
             }\r
-            this.hiddenOut[j] = this.sigmoid(hidden[j]);\r
+            hiddenOutput[j] = this.sigmoid(hidden[j]);\r
         }\r
 \r
         // 出力層出力の計算\r
         for (int k = 0; k < SimpleNN.OUTPUT; k++) {\r
             out[k] = -this.thresholdOut[k];\r
             for (int j = 0; j < SimpleNN.HIDDEN; j++) {\r
-                out[k] += this.hiddenOut[j] * this.weightHiddenOut[j][k];\r
+                out[k] += hiddenOutput[j] * this.weightHiddenOut[j][k];\r
             }\r
-            out[k] = this.sigmoid(out[k]);\r
+            output[k] = this.sigmoid(out[k]);\r
         }\r
-\r
-        return out;\r
     }\r
 \r
     /**\r
@@ -222,10 +216,12 @@ public final class SimpleNN {
      *            順方向演算の入力データ。\r
      * @param output\r
      *            順方向演算の結果。\r
+     * @param hiddenOutput\r
+     *            順方向演算の過程の隠れ層出力を格納する配列。\r
      * @param teach\r
      *            教師信号。\r
      */\r
-    public void backwardNeuralNet(double[] input, double[] output, double[] teach) {\r
+    public void backwardNeuralNet(double[] input, double[] output, double[] hiddenOutput, double[] teach) {\r
         int i;\r
         int j;\r
         int k;\r
@@ -247,13 +243,13 @@ public final class SimpleNN {
             for (k = 0; k < SimpleNN.OUTPUT; k++) {\r
                 tempError += outputError[k] * this.weightHiddenOut[j][k];\r
             }\r
-            hiddenError[j] = this.hiddenOut[j] * (1.0 - this.hiddenOut[j]) * tempError;\r
+            hiddenError[j] = hiddenOutput[j] * (1.0 - hiddenOutput[j]) * tempError;\r
         }\r
 \r
         // 重みの補正\r
         for (k = 0; k < SimpleNN.OUTPUT; k++) {\r
             for (j = 0; j < SimpleNN.HIDDEN; j++) {\r
-                this.weightHiddenOut[j][k] += SimpleNN.ALPHA * outputError[k] * this.hiddenOut[j];\r
+                this.weightHiddenOut[j][k] += SimpleNN.ALPHA * outputError[k] * hiddenOutput[j];\r
             }\r
         }\r
         for (j = 0; j < SimpleNN.HIDDEN; j++) {\r
index e00dafc..8c08f3a 100644 (file)
@@ -550,6 +550,8 @@ public final class SimpleNNApplet extends Applet implements MouseListener, Mouse
         int r;\r
         int x;\r
 \r
+        double[] hiddenOutput = new double[SimpleNNApplet.HIDDEN];\r
+\r
         String string;\r
 \r
         // 外部サイクルエラー累計\r
@@ -614,10 +616,10 @@ public final class SimpleNNApplet extends Applet implements MouseListener, Mouse
                         // 内部サイクル\r
 \r
                         // 順方向演算\r
-                        this.recognizeOut = this.simpleNN.forwardNeuralNet(this.sampleIn);\r
+                        this.simpleNN.forwardNeuralNet(this.sampleIn, this.recognizeOut, hiddenOutput);\r
 \r
                         // 逆方向演算(バックプロパゲーション)\r
-                        this.simpleNN.backwardNeuralNet(this.sampleIn, this.recognizeOut, this.teach);\r
+                        this.simpleNN.backwardNeuralNet(this.sampleIn, this.recognizeOut, hiddenOutput, this.teach);\r
                     }\r
 \r
                     // 内部二乗誤差の計算\r
@@ -653,7 +655,7 @@ public final class SimpleNNApplet extends Applet implements MouseListener, Mouse
                 this.sampleIn = this.sampleArray[q];\r
 \r
                 // 順方向演算\r
-                this.recognizeOut = this.simpleNN.forwardNeuralNet(this.sampleIn);\r
+                this.simpleNN.forwardNeuralNet(this.sampleIn, this.recognizeOut, hiddenOutput);\r
 \r
                 // 結果の表示\r
                 g.setColor(Color.black);\r
@@ -707,7 +709,7 @@ public final class SimpleNNApplet extends Applet implements MouseListener, Mouse
         Graphics g = this.getGraphics();\r
 \r
         // 順方向演算\r
-        this.recognizeOut = this.simpleNN.forwardNeuralNet(this.writtenIn);\r
+        this.simpleNN.forwardNeuralNet(this.writtenIn, this.recognizeOut, new double[SimpleNNApplet.HIDDEN]);\r
 \r
         // 結果の表示\r
         for (int k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r