前馈神经网络训练

时间:2015-03-15 22:29:27

标签: java machine-learning neural-network

我正在尝试编写Feed Forward NN,我正在测试它以学习x * y函数,使用粒子群优化来学习(PSO算法正在运行)但它甚至无法接近学习函数。我已多次查看我的代码,所以我不知道我是否只是对NN算法中的任何明显错误视而不见!

架构是一个int [],因此{No'输入,No'隐藏神经元,No'输出} 所以我在这里使用{2,3,1}来表示x * y。

注意 - 为输入层和隐藏层中的偏差添加神经元0。激活功能是tanh()

//takes in array of inputs, and weight vector w
public float[] solve(float[] input, float[] w){

    int max_neurons = 0;
    for(int i =0; i<this.architecture.length; i++){
        max_neurons = this.architecture[i]>max_neurons? this.architecture[i]:max_neurons;
    }
    //layer output arrays
    float[] output = new float[max_neurons+1]; //+1 for bias neuron 0
    float[] output_l = new float[max_neurons+1];
    output[0] = 1; //set bias
    output_l[0] = 1; //set bias
    //setup from input
    for(int i = 0; i<architecture[0]; i++){
        output[i+1] = input[i];

    }
    //iterate through hidden layers
    int hidden_layers = architecture.length-2;
    int vector_index = 0;
    float av = 0;
    for(int l = 1; l<=hidden_layers; l++){
        for(int n = 1; n<=architecture[l]; n++){
            av = 0;
            for(int k = 0; k<=architecture[l-1]; k++){
                av += output[k]*w[vector_index];
                vector_index++;
            }
            output_l[n] = af.activation(av);
        }
        output = Arrays.copyOf(output_l, output_l.length);
    }

    //output layer no activation function
    int l = architecture.length-1;
    for(int n = 0; n<architecture[l]; n++){
        av = 0;
        for(int k = 0; k<=architecture[l-1]; k++){
            av += output[k]*w[vector_index];
            vector_index++;
        }
        output_l[n] = av;
    }
    return Arrays.copyOf(output_l, output_l.length);
}

1 个答案:

答案 0 :(得分:2)

首先也是最重要的是,无论你如何编码,前馈多层神经网络都不会学习x * y,特别是当数据以两个连续输入的形式呈现时。理由:1)。 x * y输出是无界的,正常的MLP不适合学习这些功能。在给定适当的归一化数据的情况下,它最多只能接近x * y的某个固定范围2)。为了正确学习乘法,应该将数字表示为二进制(每个输入神经元一位)。有关使用NN进行算术运算的进一步讨论,请参阅this paper

结论:对于调试新实现的神经网络,x * y是一个非常糟糕的选择。考虑使用AND,OR,XOR等逻辑门。