0

-1 と 1 の範囲内で float を生成する必要があります。次の行を使用しています。

 weights[i] = random.nextFloat() * (weightMax - weightMin) + weightMin;

どこweightMax = 1weightMin = -1

ただし、場合によっては NaN が生成されます。どうすればそれを防ぐことができますか?

編集:はい、あなたは正しいです。私は後でこれをやっています:

private void run_neural_network(double[] inputs, double[] outputs) {
    int i, j;
    int weight_counter = 0;

    for (i = 0; i < NB_OUTPUTS; i++) {
        double sum = 0.0;
        for (j = 0; j < NB_INPUTS; j++) {
            sum += inputs[j] * weights[weight_counter];
            weight_counter++;
        }
        outputs[i] = (Math.tanh(sum + weights[weight_counter]));
        weight_counter++;
    }
}

そして、それがsumNaN のソースです。

[EpuckController] inputs0: 0.0, weight0 0.06174159,
[EpuckController] inputs1: 306.1555543759677, weight1 -7.409203E-23,
[EpuckController] inputs2: 0.0, weight2 1.2461361E-29,
[EpuckController] inputs3: 307.56460985278545, weight3 194105.33,
[EpuckController] inputs4: 0.0, weight4 0.41100776,
[EpuckController] inputs5: 0.0, weight5 0.0013858302,
[EpuckController] inputs6: 320.0046791338875, weight6 -1.49799987E14,
[EpuckController] inputs7: 0.0, weight7 195593.81,
[EpuckController] inputs8: 421.5353365457416, weight8 -0.8191289,
[EpuckController] Sum NaN
4

1 に答える 1

3

NaN が別の場所から来ているのではないかと強く疑っています。たとえば、後で重みを除算するためです。

確かに証拠ではありませんが、私は10億のフロートを作成しましたが、あなたが提案した動作は見られませんでした:

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Random random = new Random();
        for (int i = 0; i < 1000000000; i++) {
            float f = random.nextFloat() * 2 - 1;
            if (Float.isNaN(f)) {
                System.out.println("NaN!");
            }
        }
    }
}

(そしてもちろん、提供したコードが NaN を生成することは意味がありません。)

Float.isNaN配列の割り当ての直後にテストを追加することをお勧めします。そのとき見えなくても、後で表示される場合は、ウェイト自体ではなく、ウェイトで行っていることに問題があることは明らかです。

于 2013-04-13T16:06:28.560 に答える