2015-12-01 55 views
1

我正在編碼多人感知器,我已經單獨計算了S形,但是想用循環代替。我怎樣才能實現這個循環?這是我的工作代碼:如何使用循環?

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

您可以創建一個double數組來保存乙狀結腸值和權重的每一層。例如:

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組成。我組合這些並在數組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}; 

請注意,沒有靈活性,以初始化權重的數量。如果你使用這種架構(第一層有兩個神經元,第二層有一個神經元),那麼你只能在第一個數組中有4個權重,而在第二個數組中只能有2個權重。

+0

我將如何輸入權重並打印結果?例如,Sigmoid1 = 0.2,Sigmoid2 = 0.5 – Miguel

+0

傳統上,在神經網絡中,權重通常在[-1,1]之間隨機生成(儘管新研究表明其他方法,這應該現在工作正常)。但是爲了保持它的風格,你可以使用'double weights_layer1 [] = {.2,.3,.4,.5}'和'double weights_layer2 [] = {.6,.7}'然後打印只會繞過圖層功能。 'for(int i = 0; i Andnp

+0

你是什麼意思的'sigmoid_layer1','weights_layer1','layer1_output_size'這和我用的實現一樣:'int x1 = 1;','double sigmoid1;' – Miguel

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

}