文章 "神经网络轻松制作" - 页 5

 

几年前拍摄的一部有趣的电影。它的名字叫《找到 7 个不同点》:-))))




 
Boris Egorov:
请举例说明...不太清楚如何使用
Boris Egorov:

你不明白,我对神经网络很熟悉

如果没有逻辑,我就不明白。

如果你熟悉,你就知道如何使用。

但如果只是以这种形式抱怨文章,那我同意。

 
Stanislav Korotky:

如果没有逻辑,我就不明白了。

如果你熟悉它,你就知道如何使用它。

但如果只是以这种形式抱怨文章,那我同意。

是的,正是对这篇文章的不满,尽管这篇文章确实很酷,但并不是每个人都知道它,而且我个人也懒得直接拿去尝试--这会耗费很多时间,而且不能保证结果,还必须踩着幼稚的耙子,这就是为什么我想知道 "它是如何工作的"--从至少在一个简单模型上的交易结果以及在特定设备上训练这个模型的速度的意义上来说,我明白,如果作者写了这部巨著,他肯定至少有一些计算模型,至少可以得出一些结果。

 
Stanislav Korotky:

如果你熟悉它,你就知道如何使用它。

.....有很多奇特之处。

 
Boris Egorov:

这不是事实 ....这里还有一些特殊之处。

我提供了一些链接(你仍然可以找到它们),其中有相同 NS 的实现方法和使用示例。这不是第一篇相关文章,还有更详细的文章。

 
Stanislav Korotky:

我提供了一些链接(你仍然可以找到它们),其中有相同 NS 的实现方法和使用示例。这不是第一篇相关文章,还有更详细的文章。

我不想再重复了,你能告诉我这是否与 "5 个为什么 "原则有关吗?

作者的回答可能不会很快,要等他花完所有费用后再回到论坛:)

 

作者,请检查bool CLayer::CreateElement(const uint index) 方法。

在第一次添加元素(神经元)后,m_data_total=0。 这不符合顺序。

你至少应该将上述方法与一个类似的方法进行比较:bool CArrayObj::Add(CObject *element)。

张贴这样未经验证的代码,你还有良心吗?

我本来不想说的,但现在不能说了。

作者从我提供链接 视频教程中移植了一个示例。这没什么不对,但至少应该写出基础代码的源代码。

关于交易、自动交易系统和交易策略测试的论坛。

讨论文章 "神经网络--很简单"。

Boris Egorov, 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 个为什么 "原则有关吗?

没有,也不要说,因为那是另一部歌剧里的内容。

 
Denis Kirichenko:

作者,请检查 bool CLayer::CreateElement(const uint index) 方法。

在第一次添加元素(神经元)后,m_data_total=0。 这是不对的。

你至少应该将上述方法与类似方法进行比较: bool CArrayObj::Add(CObject *element)....

CArrayCon::CreateElement(const int index) 方法也有同样的问题。在添加第一个元素后 m_data_total=0