如何使用循环?
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 */
}
}
我正在编写一个多人感知器,我在其中单独计算了 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 */
}
}