我怎么能用循环?

时间:2015-12-01 17:38:20

标签: loops neural-network perceptron

我正在对多人感知器进行编码,我已经单独计算了sigmoids但是想要使用循环代替。如何将其实现为循环?这是我的工作代码:

public static void main (String args[]) {

    //Initial weights    w1    w2   w3   w4   w5  w6     w7   w8
    double weights[] = {-0.1, 0.4,-0.2,-0.3, -0.2, 0.4, 0.3, -0.2};

    //number of inputs
    int x1 = 1;
    int x2 = 0;

    //out
    double target = 0;

    double sum = 0;

    double Sigmoid1;
    double Sigmoid2;
    double Sigmoid3;

    int i = 0;

    while(i< weights.length){

        Sigmoid1 = (x1 * weights[i] );
                Sigmoid1 = 1 / (1 + Math.exp(-Sigmoid1));

            Sigmoid2 = (x2 * weights[i] );
                Sigmoid2 = 1 / (1 + Math.exp(-Sigmoid2));

            Sigmoid3 = (x1 * weights[2]) + (x2 * weights[4]);
                Sigmoid3 = 1 / (1 + Math.exp(-Sigmoid3));



                 System.out.println("Sigmoid1 is: " + Sigmoid1);
                 System.out.println("Sigmoid2 is: " + Sigmoid2);
                 System.out.println("Sigmoid3 is: " + Sigmoid3);

                 break;

    }

}

}

2 个答案:

答案 0 :(得分:1)

您可以创建一个双精度数组来保存每个图层的sigmoid值和权重。例如:

double x = {1,0};

int layer1_input_size = 2; // number of inputs to network
int layer2_input_size = 2; // number of inputs to final layer

int layer1_output_size = 2; // number of outputs to first layer (must match inputs to next layer)
int layer2_output_size = 1; // number of outputs of network

// Initialize arrays to hold the values of outputs and weights for each layer
double sigmoid_layer1[] = new double[layer1_output_size];
double sigmoid_layer2[] = new double[layer2_output_size]
double weights_layer1[] = new double[layer1_input_size];
double weights_layer2[] = new double[layer2_input_size];

// iterate over each neuron in layer1
for(int j = 0; j < sigmoid_layer1.length; j++){
    double sum = 0; // sum of weights * inputs (also known as dot product)
    for(int i = 0; i < weights_layer1.length; i++){
        sum += (x[j] * weights_layer1[i]; // for every weight, multiply by corresponding input to layer
    }
    sigmoid_layer1[j] = 1 / (1 + Math.exp(-sum); // sigmoid activation
}
for(int j = 0; j < sigmoid_layer2.length; j++){
    double sum = 0;
    for(int i = 0; i < weights_layer2.length; i++){
        sum += (sigmoid_layer1[j] * weights_layer2[i]; // same as before, only now the inputs to this layer are the outputs from the previous layer
    }
    sigmoid_layer2[j] = 1 / (1 + Math.exp(-sum);
}

也可以使用相同类型的抽象来允许动态数量的层。

也许有一点背景可以进一步解释我的答案: 在神经网络或MultiLayer Perceptron中,存在多组(或层)计算单元(神经元)。一层中的每个神经元都连接到下一层中的每个神经元(至少在最简单的情况下)。层的输入是它之前的层的输出,第一层的输入是输入。到你的网络。

在你的情况下(据我所知): 您的输入位于x数组中。所以x [0] = 1是第一个输入,x [1] = 0是第二个。 你的第一层由sigmoid1和sigmoid2组成。我将这些组合在一起,并在数组sigmoid_layer1中保存了激活函数的输出。 你的第二层由sigmoid3组成。 sigmoid3的输入是sigmoid1和sigmoid2的输出。 sigmoid3的输出(保存在sigmoid_layer2中)是网络的输出。 网络中的权重数量由每个神经元的输入数量决定。例如:在第1层中有两个输入(x [0]和x [1]),并且有两个神经元(sigmoid1和sigmoid2)。这意味着你需要4个权重,其中weights_layer1 [0]和weights_layer1 [1]是第一个神经元的权重,weights_layer1 [2]和weights_layer1 [3]是第二个神经元的权重。

这意味着您的整体网络使用6个权重。第一层为4,第二层为2。要手动初始化这些权重(正如您所做的那样),可以这样做:

double weights_layer1[] = {-0.1, 0.4, -0.2, -0.3};
double weights_layer2[] = {-0.2, 0.4};

请注意,您初始化的权重数量没有灵活性。如果你采用这种架构(第一层中有2个神经元,第二层中有1个神经元),那么第一个阵列中只能有4个权重,第二个中只有2个权重。

答案 1 :(得分:0)

我可能会在while循环中执行

double sigmoidInit[3] = { x1 * weights[i], 
    x2 * weights[i], 
    (x1 * weights[2]) + (x2 * weights[4])};
  for (int j = 0; j < sigmoidInit.length; j++) {
    double sigmoid = /* math on sigmoidInit */;
    / * your print statements */
  }

}