如何使用循环?

How can I use a loop?

我正在编写一个多人感知器,我在其中单独计算了 sigmoid,但想改用循环。我如何将其实现为循环?这是我的工作代码:

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;

    }

}

}

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

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);
}

相同类型的抽象也可用于允许动态层数。

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

你的情况(据我了解): 您的输入在 x 数组中。所以 x[0] = 1 是第一个输入,x[1] = 0 是第二个。 您的第一层由 sigmoid1 和 sigmoid2 组成。我将这些组合起来,并将激活函数的 outputs 保存在数组 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 个权重。

在 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 */
  }

}