NeuralNetwork:バックプロパゲーション

私はこれで長時間頭を悩ませていました...基本的に私はニューラルネットワークバックプロパゲーショントレーニングをしようとしています。

私は正しい伝搬エラーがあると信じています。それは私のニューラルネットワークを正しく訓練していないようです....

template
class Backpropagation {
public:
  static void train(std::shared_ptr > neural_network, std::valarray input, std::valarray label, double eta = 0.10) {
    std::valarray output;

   //go forward and calculate our values
    neural_network->f(input, output);

   //error at output nodes
    std::valarray error = label - output;

    std::vector > neurons = neural_network->get_outputs();

       //set the error to our neurons
    for (std::vector >::size_type i = 0; i < neurons.size(); i++) {
      std::shared_ptr neuron = std::dynamic_pointer_cast(neurons[i]);

      neuron->set_error(error[i]);
    }

   //backpropagate our errors
    for (typename std::vector > >::size_type i = neural_network->get_layers_count() - 2; i <= neural_network->get_layers_count(); i--) {
     //go through each neuron in the layer
      std::shared_ptr > layer = neural_network->get_layer(i);

      for (typename std::vector >::size_type j = 0; j < layer->get_neurons_count(); j++) {
        std::shared_ptr neuron = std::dynamic_pointer_cast(layer->get_neuron(j));

        double sum = 0;

        std::vector > connections = neuron->get_synapse_outputs();
        for (typename std::vector >::size_type k = 0; k < connections.size(); k++) {
          std::shared_ptr post = std::dynamic_pointer_cast(connections[k]->get_neuron_post());
          sum += connections[k]->w() * post->get_error();
            }

        neuron->set_error(neuron->d() * sum);
      }
    }

   //now its time to calculate our derivative (dw) and update our weights
    for (typename std::vector > >::size_type i = 0; i < neural_network->get_layers_count(); i++) {
      std::shared_ptr > layer = neural_network->get_layer(i);

      for (typename std::vector >::size_type j = 0; j < layer->get_neurons_count(); j++) {
        std::shared_ptr neuron = std::dynamic_pointer_cast(layer->get_neuron(j));
        std::vector > connections = neuron->get_synapse_inputs();

        double error = neuron->get_error();
        for (typename std::vector >::size_type k = 0; k < connections.size(); k++) {
          std::shared_ptr pre = connections[k]->get_neuron_pre();
         //std::cout << "set_weight: " << connections[i]->w() + alpha * error * pre->f() << " " << error << " " << pre->f() << std::endl;

          connections[k]->set_weight(connections[k]->w() + eta * error * pre->f());
        }
      }
    }
  }

};
0
単純なコードよりも多くの情報を私たちに提供すれば、たくさんのアイデアが得られます。あなたの入力はどのように見えますか?あなたはリファレンス実装でそれを訓練しましたか?中間結果は正しいですか?
追加された 著者 Sebastian Dressler,
エラーの逆伝播が正しいと想定していますが、これを確認できますか?逆伝播が正しい場合、エラーは重み更新中でなければならない。
追加された 著者 Sebastian Dressler,
私はあなたがtrial'n'errorを使うべきではないと思うが、バックプロパゲーションについて何かを読んではいけないと思う this と入力します。そこにはいくつかの逆伝播シミュレータもあります。そして、たぶんあなたは鉛筆と紙をつかんで、まずこのようにしなければなりません。
追加された 著者 Sebastian Dressler,
XORは実装が比較的容易でなければなりません。私は4つのノードなどで何かを見ました。たぶん、別のビットをGoogleで検索して明示的に検索するので、参考になるでしょう。
追加された 著者 Sebastian Dressler,
私は本当に参照実装とのアルゴリズムを段階的にチェックするべきだと思っています。
追加された 著者 Sebastian Dressler,
AND/OR/XORの場合のテスト。
追加された 著者 user988098,
2つの入力ノード、4つの隠れノード、および1つの出力ノードを使用する。中間結果の意味は?ありがとう。
追加された 著者 user988098,
出力層のエラーで...私は同様に微分でそれを掛ける必要がありますか?私はそれを試みた、それはまだdoesnt仕事= \
追加された 著者 user988098,
私は8つの隠れたノードと1000の訓練のエポックのようなものが必要となり、適切に動作するようにする必要があります。または4つの隠れたノードとXORのための10kトレーニングエポック。これは正しいと思いますか? XORのために600エポックを使用した。私のηは0.1 thです...あなたが引用した論文は、XORのためにどれだけ多くの隠れたノードが使われたかを言いませんでした...
追加された 著者 user988098,
XORのために、トレーニングの5kエポックとその4つの隠れたノード...右の音ですか? 5kはちょっと過重なようですか?私はbackpropagationが本当に速かったと思った...
追加された 著者 user988098,
それはw/learning_rate = 0.75だった
追加された 著者 user988098,

答えはありません

0