我正在对多人感知器进行编码,我已经单独计算了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;
}
}
}
答案 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)
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 */
}
}