神经网络数据集学习

时间:2016-05-01 16:27:51

标签: java neural-network artificial-intelligence backpropagation

现在,我正在编写自己的神经网络来识别数字。它对于一个给定输入和一个预期输出完全正常。它接近这些值,直到总误差大约为0.00001或类似的值。但显然我需要我的网络来学习更多的模式。我编写了自己的类DataSet,用于存储输入和所需的输出。我现在的问题是:如何让我的程序从我的集合中学习每一个模式。现在我这样做:只是逐个学习每个模式,并希望总错误越来越好。但在我的网络中(784 = 28 * 28)输入神经元,15个隐藏神经元和10个输出神经元,只有3个模式,为什么总误差大约为0.4它根本不匹配目标所以我想问你能做什么

我的代码如下:

public void CalculateSignalErrors(Matrix1d in, Matrix1d exp) {

    int i, j, k, OutputLayer;
    double Sum;

    this.calculate(in, false);


    for (i = 0; i < this.OUTPUT_SIZE; i++) {
        signalErrors[this.NETWORK_SIZE - 1].set(i,
                (this.outputs[this.NETWORK_SIZE - 1].get(i) - exp.get(i))
                        * this.derivatives[this.NETWORK_SIZE - 1].get(i));

    }

    for(i = this.NETWORK_SIZE - 2; i > 0; i--){
        for(j = 0; j < outputs[i].X; j ++){
            Sum = 0;
            for(k = 0; k < outputs[i+1].X; k++){
                Sum = Sum + weights[i+1].get(k, j) * 
                        signalErrors[i+1].get(k);
            }
            signalErrors[i].set(j,derivatives[i].get(j) * Sum);
        }
    }

}

public void backpropagateError(double eta) {
    int i,j,k;
    for(i = this.NETWORK_SIZE-1; i > 0; i--){
        for(j = 0; j < outputs[i].X; j++){
            for(k = 0; k  < outputs[i-1].X; k++){
                this.weights[i].set(j, k,this.weights[i].get(j, k) + (-eta * this.signalErrors[i].get(j) * this.outputs[i-1].get(k)));
            }
            this.biases[i].set(j, this.biases[i].get(j) - eta * this.signalErrors[i].get(j));
        }
    }
}

public void train(Matrix1d in, Matrix1d exp, double eta){
    this.CalculateSignalErrors(in, exp);
    this.backpropagateError(eta);
}

和我对数据集的培训:

public void train(TrainSet set, double epochs, double eta, boolean printIt){

    for(int e = 0; e < epochs; e ++){
        TrainSetIterator it = set.iterator();
        while(it.hasNext()){
            Matrix1d[] v = it.next();
            this.train(v[0], v[1], eta);

        }
        if(printIt){
            //System.out.format("%-9s %-7s %-15s%n", "Epoch:", e , outputError(set));
            System.out.println(outputError(set));
        }
    }
}

我的错误计算:

public double outputError(Matrix1d input, Matrix1d expected) {
    Matrix1d out = this.calculate(input, false);

    expected = expected.clone();
    out.sub(expected);


    return (out.length() * out.length() * 0.5);

}

public double outputError(TrainSet set){
    TrainSetIterator it = set.iterator();
    double e = 0;
    while(it.hasNext()){
        Matrix1d[] o = it.next();
        e += outputError(o[0], o[1]);
    }

    return (e / (double)(set.size()));
}

同样重要的是要知道,当我向前提供数据时,我将我的衍生物直接写入神经元(如果你想知道衍生物[x] .get(y)的含义。) =层)(y =神经元)

0 个答案:

没有答案