Discussão do artigo "Redes Neurais de Maneira Fácil" - página 5

 

Um filme interessante que foi feito alguns anos antes. Chama-se Find 7 Differences (Encontre 7 diferenças) :-))))




 
Boris Egorov:
Por favor, dê um exemplo ... não está muito claro como usá-lo
Boris Egorov:

você não está entendendo, estou familiarizado com redes neurais

Quando não há lógica, eu não entendo.

Se você está familiarizado, sabe como usá-las.

Mas se for apenas uma reclamação sobre o artigo nesse formato, então eu concordo.

 
Stanislav Korotky:

Quando não há lógica, eu não entendo.

Se você está familiarizado com ela, sabe como usá-la.

Mas se for apenas uma reclamação sobre o artigo nesse formato, eu concordo.

Sim exatamente ao artigo, apesar do fato de que o artigo é realmente legal, é só que nem todo mundo sabe sobre isso e eu pessoalmente sou muito preguiçoso para simplesmente pegá-lo e experimentá-lo - vai consumir tanto tempo e sem garantir o resultado e com a obrigatoriedade de pisar em ancinhos infantis, é por isso que eu quero saber "como funciona" - no sentido de negociar resultados pelo menos em um modelo simples e a velocidade de treinamento deste modelo em equipamentos específicos, eu entendo que se o autor escreveu este trabalho titânico, ele certamente tem pelo menos alguns modelos calculados e seria possível desenhar pelo menos alguns resultados.

 
Stanislav Korotky:

Se você está familiarizado com ele, sabe como usá-lo.

Isso não é uma coisa certa. ..... Há muitas peculiaridades.

 
Boris Egorov:

e isso não é um fato .... Ainda há algumas peculiaridades aqui.

Eu forneci alguns links (e você ainda pode encontrá-los) com implementações do mesmo NS com exemplos de uso. Este não é o primeiro artigo sobre o assunto, existem outros mais detalhados.

 
Stanislav Korotky:

Eu forneci alguns links (e você ainda pode encontrá-los) com implementações do mesmo NS com exemplos de uso. Este não é o primeiro artigo sobre o assunto, existem outros mais detalhados.

Não quero me repetir, mas você pode me dizer se há alguma conexão com o princípio "5 porquês"?

E a resposta do autor provavelmente não será dada em breve, e você terá que esperar até que ele gaste toda a taxa e retorne ao fórum :)

 

Autor, verifique o método bool CLayer::CreateElement(const uint index).

Após a primeira adição de um elemento (neurônio), você tem m_data_total=0. Isso não está em ordem.

Você deveria pelo menos comparar o método acima com um método semelhante: bool CArrayObj::Add(CObject *element).

Você tem alguma consciência para publicar esse código não verificado ou o quê?

Eu não queria dizer isso, mas não posso mais.

O autor portou um exemplo do tutorial em vídeo para o qual dei um link aqui. Não há nada de errado com isso, mas pelo menos valeria a pena escrever sobre a fonte do código base.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Discussão do artigo "Neural Networks - it's easy" (Redes neurais - é fácil).

Boris Egorov, 2020.01.27 04:56 pm

Sim exatamente para o artigo, apesar do fato de que o artigo é muito legal, só que nem todo mundo entende e aqui eu sou pessoalmente preguiçoso para apenas pegar e tentar - vai consumir muito tempo e sem garantir o resultado e com a obrigatoriedade de pisar em ancinhos de bebê, então eu quero saber "como funciona" - no sentido dos resultados da negociação pelo menos em um modelo simples e a velocidade de treinamento deste modelo em equipamentos específicos, eu entendo se o autor escreveu este trabalho titânico, então ele certamente tem pelo menos alguns modelos calculados e poderia ser lançado pelo menos alguns rezu

Há um exemplo no tutorial em vídeo. Apenas o autor do artigo decidiu não se incomodar. Aqui estão as fontes.
 

Se você observar o original, ele tem esse método:

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

    // Atribuir (travar) os valores de entrada aos neurônios de entrada
    for (unsigned i = 0; i < inputVals.size(); ++i) {
        m_layers[0][i].setOutputVal(inputVals[i]);
    }

    // propagação direta
    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);
        }
    }
}

análogo no artigo:

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);
        }
     }
  }

Linha destacada em amarelo. E, dessa forma, o método não funciona. Porque na fonte ele adiciona outro neurônio de polarização (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];

        // Temos uma nova camada, agora a preenchemos com neurônios e
        // adicionar um neurônio de polarização em cada camada.
        for (unsigned neuronNum = 0; neuronNum <=  topology[layerNum]; ++neuronNum) {
            m_layers.back().push_back(Neuron(numOutputs, neuronNum));
            cout << "Made a Neuron!" << endl;
        }

        // Forçar a saída do nó de polarização para 1,0 (foi o último neurônio empurrado nessa camada):
        m_layers.back().back().setOutputVal(1.0);
    }
}
 
Aleksey Mavrin:

Assistindo a tudo, não quero me repetir, você pode me dizer se há alguma conexão com o princípio dos "5 porquês"?

Não. E não diga, porque isso é de uma ópera diferente.

 
Denis Kirichenko:

Autor, verifique o método bool CLayer::CreateElement(const uint index).

Após a primeira adição de um elemento (neurônio), você tem m_data_total=0. Isso não está correto.

Você deveria pelo menos comparar o método acima com um método semelhante: bool CArrayObj::Add(CObject *element)...

O mesmo absurdo com o método CArrayCon::CreateElement(const int index). Após a adição do primeiro elemento, m_data_total=0.