2017-04-03 1 views
0

, 나는 반복C++ 메모리 오류

free(): invalid next size (fast) 

아직 코드는 지금까지 참조를 작성하려면로가는 오류를 얻을. 특히 특정 행을 주석 처리하면 오류를 수정하는 것으로 보입니다. 그러나 이것은 매우 중요한 선입니다.

void neuron::updateWeights(layer &prevLayer) { 
    for(unsigned i = 0; i < prevLayer.size(); i++) { 
     double oldDeltaWeight = prevLayer[i].m_connections[m_index].m_deltaWeight; 
     double newDeltaWeight = eta * prevLayer[i].m_output * m_gradient + alpha * oldDeltaWeight; 
     prevLayer[i].m_connections[m_index].m_deltaWeight = newDeltaWeight; // THIS LINE 
     prevLayer[i].m_connections[m_index].m_weight += newDeltaWeight; 
    } 
} 

어떤 도움을 주시면 감사하겠습니다.

편집 : 추가 코드 // 헤더 사용법 #include "../../Include/neuralNet.h"

// Libraries 
#include <vector> 
#include <iostream> 
#include <cmath> 

// Namespace 
using namespace std; 

// Class constructor 
neuron::neuron(unsigned index, unsigned outputs) { 
    m_index = index; 
    for(unsigned i = 0; i < outputs; i++) { 
     m_connections.push_back(connection()); 
    } 
    // Set default neuron output 
    setOutput(1.0); 
} 

double neuron::eta = 0.15; // overall net learning rate, [0.0..1.0] 
double neuron::alpha = 0.5; // momentum, multiplier of last deltaWeight, [0.0..1.0] 

// Definition of transfer function method 
double neuron::transferFunction(double x) const { 
    return tanh(x); // -1 -> 1 
} 

// Transfer function derivation method 
double neuron::transferFunctionDerivative(double x) const { 
    return 1 - x*x; // Derivative of tanh 
} 

// Set output value 
void neuron::setOutput(double value) { 
    m_output = value; 
} 

// Forward propagate 
void neuron::recalculate(layer &previousLayer) { 

    double sum = 0.0; 
    for(unsigned i = 0; i < previousLayer.size(); i++) { 
     sum += previousLayer[i].m_output * previousLayer[i].m_connections[m_index].m_weight; 
    } 
    setOutput(transferFunction(sum)); 
} 

// Change weights based on target 
void neuron::updateWeights(layer &prevLayer) { 
    for(unsigned i = 0; i < prevLayer.size(); i++) { 
     double oldDeltaWeight = prevLayer[i].m_connections[m_index].m_deltaWeight; 
     double newDeltaWeight = eta * prevLayer[i].m_output * m_gradient + alpha * oldDeltaWeight; 
     prevLayer[i].m_connections[m_index].m_deltaWeight = newDeltaWeight; 
     prevLayer[i].m_connections[m_index].m_weight += newDeltaWeight; 
    } 
} 

// Complex math stuff 
void neuron::calculateOutputGradients(double target) { 
    double delta = target - m_output; 
    m_gradient = delta * transferFunctionDerivative(m_output); 
} 

double neuron::sumDOW(const layer &nextLayer) { 
    double sum = 0.0; 

    for(unsigned i = 1; i < nextLayer.size(); i++) { 
     sum += m_connections[i].m_weight * nextLayer[i].m_gradient; 
    } 

    return sum; 
} 

void neuron::calculateHiddenGradients(const layer &nextLayer) { 
    double dow = sumDOW(nextLayer); 
    m_gradient = dow * neuron::transferFunctionDerivative(m_output); 
} 
또한

라인이 여기

// Update weights 
    for(unsigned layerIndex = m_layers.size() - 1; layerIndex > 0; layerIndex--) { 
     layer &currentLayer = m_layers[layerIndex]; 
     layer &previousLayer = m_layers[layerIndex - 1]; 

     for(unsigned i = 1; i < currentLayer.size(); i++) { 
      currentLayer[i].updateWeights(previousLayer); 
     } 
    }  
+2

문제를 자세히 설명하십시오. 현재, 당신이이 문제에 얼마나 정확하게 도달했는지는 불분명하며 따라서 우리는 당신을 도울 수 없습니다. Stack Overflow에서 우리가 기대하는 질문에 대한 더 좋은 아이디어를 얻으려면 [질문] 좋은 질문을 읽어보십시오. 또한 제공된 예제가 최소한이지만 완전하거나 검증 할 수 없으므로 [mcve] 작성에 도움이되는 페이지를 찾을 수 있습니다. – jaggedSpire

+0

그게 도움이 되었으면 좋겠습니까? prevLayer [i] .m_connections [m_index] .m_deltaWeight에 값을 할당하면 오류가 발생하지만 그 값을 검색하는 것은 그리 유용하지 않습니다. – Brian

+1

컴파일 오류가 아니라 런타임 오류 (C 라이브러리의)입니다. 그리고 게시 한 코드는 [mcve]가 아닙니다. – melpomene

답변

0

라고 귀하 생성자는 클래스의 N 'outputs'm_connections을 초기화합니다.

하지만 당신은 많은 장소가 호출이 :

m_connections[m_index] 

이 m_index> 출력하면 어떻게됩니까? 이 문제가 귀하의 문제입니까? 생성자의 첫 번째 줄에서 어설 션 (http://www.cplusplus.com/reference/cassert/assert/)를 포함하여보십시오 :

assert(index < outputs) 

을 당신은 아마 어딘가 잘못된 포인터 액세스를 가지고있다.