Что это значит, когда ваша сверточная сеть предсказывает одинаковые значения для всех классов? - PullRequest
0 голосов
/ 14 июля 2020

Это код обратного распространения, посмотрите, пожалуйста

Это то, что он выводит, посмотрите на прогнозы

// это всего лишь его часть с прямой связью

 template <typename T>
T Run_Network(int Class_Neurons_size,std::vector<std::vector<T> >Input,std::vector<std::vector<T> >Weight_Store,std::vector<std::vector<T> >Weight_Store_2,std::vector<std::vector<T> >Weight_Store_3){
    NEX_MATRIX::Math Operations;
   
    
    //start with the first layer
for(int i=0;i<3;i++){
        float activation= Hidden_Biases[i];
    for(std::vector<std::vector<float> >::size_type j=0;j<Input.size();j++){
        for(std::vector<float>::size_type k=0;k<Input[j].size();k++){
            activation+= Weight_Store[j][k]*Input[j][k];
         
        }
    }
    Hidden_Neurons.push_back(Operations.Sigmoid(activation));
}
    Hidden_Neurons_Store[0]=Hidden_Neurons[0];
    Hidden_Neurons_Store[1]=Hidden_Neurons[1];
    Hidden_Neurons_Store[2]=Hidden_Neurons[2];
    
    
    
    //H2 Layer
    for(int j=0;j<3;j++){
        float activation= Hidden_Biases_2[j];
        for(int k=0;k<3;k++){
            activation+= Hidden_Neurons[k]*Weight_Store_2[j][k];
        }
        Hidden_Neurons_2.push_back(Operations.Sigmoid(activation));
    }
    while (Hidden_Neurons.size()!=0){
        Hidden_Neurons.pop_back();
    }
    //H3 Layer
    for(int j=0;j<2;j++){
        float activation= Hidden_Biases_3[j];
        for(int k=0;k<Output_Biases.size();k++){
            activation+= Hidden_Neurons_2[k]*Weight_Store_3[j][k];
        }
        Hidden_Neurons_3.push_back(Operations.Sigmoid(activation));
    }
    while(Hidden_Neurons_2.size()!=0){
         Hidden_Neurons_2.pop_back();
     }
    //Output Layer with all Current Classes
    //problem is here\n;
    for(int j=0;j<Output_Biases.size();j++){
        float activation= Output_Biases[j];
        for(int i=0;i<Output_Weight_Store.size();i++){
        for(int k=0;k<3;k++){
            activation+= Hidden_Neurons_3[k]*Output_Weight_Store[i][k];
        }
        }
        Output_Neuron.push_back(Operations.Sigmoid(activation));
    }
    while(Hidden_Neurons_3.size()!=0){
        Hidden_Neurons_3.pop_back();
        }
               
   Output_Neuron= SoftMax(Output_Neuron);
    std::cout<<"\n";
    for(int j=0;j<Output_Neuron.size();j++){
    std::cout<<Output_Neuron[j]<<"\n";
    }
    std::cout<<"\n";
    return MaxPool(Output_Neuron);
}

Кажется, я не могу понять, как решить эту проблему или даже как к ней подойти, использую ли я неправильную архитектуру или у меня просто есть небольшая вычислительная проблема, которая где-то незаметна? Я хотел бы помочь, спасибо.

...