微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用 C++ 从头开始​​编写的人工神经网络卡在最大可能的输出上

如何解决用 C++ 从头开始​​编写的人工神经网络卡在最大可能的输出上

我正在从头开始创建 ANN,以更好地了解它的工作原理。它应该采用从 0 到 1 的数字输入并输出 0 或 1。但是我被卡住了,因为输出神经元达到最大可能值(在这种情况下为 1)并保持在那里。我在 backprog 算法中看不到任何错误,但我是深度学习的初学者,所以这可能是问题所在。这是 backprog 代码

void backpropagation(float target,float output)
    {
        //counting staring delta
        std::vector<std::vector<float>> vectors_of_delta;
        std::vector<std::vector<std::vector<float>>> vectors_of_old_weights;
        for(int i = 0; i<number_of_layers_-2; i++) //pushing in dummie vectors to better navigate through it later
        {
            std::vector<std::vector<float>> temp;
            std::vector<float> temp2;
            vectors_of_old_weights.push_back(temp);
            vectors_of_delta.push_back(temp2);
        }
        //counting small starting delta
        std::vector<float> starting_small_delta_vector;
         
        for(int i = 0; i<neurons_[number_of_layers_-2].size(); i++)
        {
            float delta = -(target/output)*(1/(1 + exp(-neurons_[number_of_layers_-2][i].get_z())))*(1- (1/(1 + exp(-neurons_[number_of_layers_-2][i].get_z()))));
            starting_small_delta_vector.push_back(delta);
        } 
        
        //in convolution will have to iterate over it because there will be more outputs
        std::vector<std::vector<float>> placeholder_vector_weights;
        placeholder_vector_weights.push_back(neurons_[number_of_layers_-2][0].get_weigts());
        vectors_of_old_weights.push_back(placeholder_vector_weights);
        vectors_of_delta.push_back(starting_small_delta_vector);
        //
        
        for(int i = 0; i<neurons_[number_of_layers_-2].size(); i++)
        {
            neurons_[number_of_layers_-2][i].set_bias(learning_rate_ * starting_small_delta_vector[i]);
            std::vector<float> difference_vector;
            for(int j = 0; j < neurons_[number_of_layers_-2][i].get_number_of_weigts(); j++)
            {
                difference_vector.push_back(learning_rate_ * starting_small_delta_vector[i] * (vector_of_outputs_for_backpropagation[number_of_layers_-3][i]));
            }
            neurons_[number_of_layers_-2][i].set_weights(difference_vector);
        }
        // finishing counting starting delta

        for(int i = number_of_layers_-3; i > 0; i--)//iteration over layers
        {
            std::vector<float> delta_vector;
            for(int j = 0; j < neurons_[i].size(); j++)//iteration over neurons
            {
                float sum_of_weights_and_deltas = 0;
                for(int k = 0; k < vectors_of_old_weights[i+1].size(); k++ )//iteration over layers
                {
                   sum_of_weights_and_deltas += vectors_of_old_weights[i+1][k][j] * vectors_of_delta[i+1][k];
                }
                float delta = sum_of_weights_and_deltas * (1/(1+exp(-(neurons_[i][j].get_z())))) * (1-(1/(1+exp(-(neurons_[i][j].get_z())))));
                delta_vector.push_back(delta);
                neurons_[i][j].set_bias(learning_rate_ * delta);
                vectors_of_delta.push_back(delta_vector);
                std::vector<float> difference_vector;
                for(int k = 0; k < neurons_[i][j].get_number_of_weigts(); k++)
                {
                    difference_vector.push_back(learning_rate_ * delta * vector_of_outputs_for_backpropagation[i-1][k]);// * vector_of_outputs_for_backpropagation[i-1][k]
                }
                neurons_[i][j].set_weights(difference_vector);
            }
            vectors_of_delta.push_back(delta_vector);
        }

    }

我使用本文中的数学:https://medium.com/@tiago.tmleite/neural-networks-multilayer-perceptron-and-the-backpropagation-algorithm-a5cd5b904fde 其余代码和输入数据位于此存储库中:https://github.com/SzymonPabjan/simple_ANN

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。