記事"パーセプトロンニューラルネットワーク"についてのディスカッション - ページ 5

 

その数年前に作られた面白い映画がある。7つの違いを見つけよう』という作品だ :-)))




 
Boris Egorov:
例を挙げてください.使い方がよくわからない
ボリス・エゴロフ

あなたは理解していない、私はニューラルネットワークに精通している

ロジックがない場合は理解できない。

慣れていれば、使い方はわかる。

しかし、このような形の記事に対する単なる文句であれば、同意する。

 
Stanislav Korotky:

ロジックがないと、理解できない。

慣れている人なら、使い方はわかっているはず。

ただ、このような形の記事に対する不満であれば、同感です。

そう、まさにその通りだ。記事は本当にクールであるにもかかわらず、誰もがそれを知っているわけではないし、私個人はただそれを手に取って試すにはあまりにも怠惰だ。それは多くの時間を費やし、結果を保証することなく、幼稚なレーキを踏むことが義務付けられている。だからこそ、私は「どのように機能するのか」を知りたいのだ。少なくとも単純なモデルでの取引結果や、このモデルを特定の装置でトレーニングするスピードという意味で、著者がこの巨編を書いたのであれば、彼は少なくともいくつかの計算されたモデルを持っていることは確かで、少なくともいくつかの結果を描くことは可能だろうと理解している。

 
Stanislav Korotky:

慣れている人なら、使い方はわかっているはずだ。

それは確実ではない。クセがあるからね。

 
Boris Egorov:

それは事実ではない.ここにはまだ奇妙な点がある。

私は同じNSの実装と使用例のリンクをいくつか紹介した。これはこのトピックに関する最初の記事ではない。

 
Stanislav Korotky:

同じNSの実装と使用例について、いくつかのリンクを紹介した。これはこのトピックに関する最初の記事ではない。

繰り返しになりますが、"5 Why "の原則と何か関係があるのでしょうか?

そして、著者からの答えは、おそらく彼がすべての手数料を費やして、フォーラムに戻るまで待つことはすぐにはありません :)

 

著者、bool CLayer::CreateElement(const uint index) メソッドをチェックしてください。

最初の要素(ニューロン)の追加後、m_data_total=0になって います。順序が違います。

少なくとも、上記のメソッドと似たようなメソッドであるbool CArrayObj::Add(CObject *element)を比較すべきです。

このような検証されていないコードを投稿する良心はあるのでしょうか?

言いたくなかったが、もう言えない。

この作者は、私がここに リンクを貼ったビデオチュートリアルの例を移植した。何も問題はないが、少なくともベースコードのソースについて書く価値はあるだろう。

取引、自動取引システム、取引戦略のテストに関するフォーラム。

ニューラル・ネットワーク - それは簡単だ」という記事についての議論。

ボリス・エゴロフ, 2020.01.27 04:56 pm

はい、正確に記事に、記事は本当にクールであるという事実にもかかわらず、ちょうど誰もがそれを理解していない、ここで私は個人的に取るだけで試して怠惰である - それは非常に多くの時間を食べるだろうし、結果を保証することなく、赤ちゃん熊手を踏む義務で、私は "それがどのように動作するか "を知りたい - 少なくとも単純なモデルと、特定の機器上でこのモデルを訓練する速度の取引結果の意味で、私は著者がこの巨人の仕事を書いた場合、彼は確かに、少なくともいくつかの計算されたモデルを持っており、少なくともいくつかのrezuを投げることができる理解している

ビデオチュートリアルに例がある。ただ、記事の著者は気にしないことにした。ソースは こちら。
 

オリジナルを 見ると、このような方法がある:

void Net::feedForward(const vector<double> &inputVals)
{
    assert(inputVals.size() == m_layers[0].size() - 1);

    // 入力値を入力ニューロンに割り当てる(ラッチする)。
    for (unsigned i = 0; i < inputVals.size(); ++i) {
        m_layers[0][i].setOutputVal(inputVals[i]);
    }

    // 順伝播
    for (unsigned layerNum = 1; layerNum < m_layers.size(); ++layerNum) {
        Layer &prevLayer = m_layers[layerNum - 1];
        for (unsigned n = 0; n < m_layers[layerNum].size() - 1; ++n) {
            m_layers[layerNum][n].feedForward(prevLayer);
        }
    }
}

記事中のアナログ:

void CNet::feedForward(const CArrayDouble *inputVals)
  {
   if(CheckPointer(inputVals)==POINTER_INVALID)
      return;
//---
   CLayer *Layer=layers.At(0);
   if(CheckPointer(Layer)==POINTER_INVALID)
     {
      return;
     }
   int total=inputVals.Total();
   if(total!=Layer.Total()-1)
      return;
//---
   for(int i=0; i<total && !IsStopped(); i++) 
     {
      CNeuron *neuron=Layer.At(i);
      neuron.setOutputVal(inputVals.At(i));
     }
//---
   total=layers.Total();
   for(int layerNum=1; layerNum<total && !IsStopped(); layerNum++) 
     {
      CArrayObj *prevLayer = layers.At(layerNum - 1);
      CArrayObj *currLayer = layers.At(layerNum);
      int t=currLayer.Total()-1;
      for(int n=0; n<t && !IsStopped(); n++) 
        {
         CNeuron *neuron=currLayer.At(n);
         neuron.feedForward(prevLayer);
        }
     }
  }

黄色で強調した線。そしてこの形では、メソッドは機能しない。なぜなら、ソースでは 、もう一つのバイアスニューロン(bias neuron)が 追加されて いるからだ。

Net::Net(const vector<unsigned> &topology)
{
    unsigned numLayers = topology.size();
    for (unsigned layerNum = 0; layerNum < numLayers; ++layerNum) {
        m_layers.push_back(Layer());
        unsigned numOutputs = layerNum == topology.size() - 1 ? 0 : topology[layerNum + 1];

        // 新しいレイヤーができたので、それをニューロンで埋める。
        // 各レイヤーにバイアス・ニューロンを追加する。
        for (unsigned neuronNum = 0; neuronNum <=  topology[layerNum]; ++neuronNum) {
            m_layers.back().push_back(Neuron(numOutputs, neuronNum));
            cout << "Made a Neuron!" << endl;
        }

        // バイアス・ノードの出力を強制的に1.0にする(このレイヤーで最後にプッシュされたニューロン):
        m_layers.back().back().setOutputVal(1.0);
    }
}
 
Aleksey Mavrin:

繰り返しになりますが、"5 Why's "の原則と何か関係があるのでしょうか?

いや、それは別のオペラの話だからやめてくれ。

 
Denis Kirichenko:

著者、bool CLayer::CreateElement(const uint index)メソッドをチェックしてください。

最初の要素(ニューロン)の追加後、m_data_total=0になって います。これは正しくありません。

少なくとも上記のメソッドと似たようなメソッドを比較すべきです:bool CArrayObj::Add(CObject *element)...

CArrayCon::CreateElement(constintインデックス) メソッドと同じナンセンス。最初の要素追加の後、m_data_total=0