Я внедряю искусственную нейронную сеть в C++ для моего курса машинного обучения. Вот мой код «Нейрон» -Обработка освобождения памяти между классами в C++
struct Neuron
{
float *inputs; // pointer to inputs array
int inputCount; // number of input
float *weights;
float sum; // linear weight sum of inputs
float output = 0.0; // output from activation function
float bias = 1.0;
float delta; // error gradient
Neuron(){}
Neuron(int inputCount)
{
this->inputCount = inputCount;
this->weights = new float [inputCount];
InitializeWeights();
}
float ActivationFunction(float x)
{
return 1.0/(1.0 + exp(-x));
}
void Calculate(float *inputs)
{
this->inputs = inputs;
float temp = 0.0;
for(int i=0; i<inputCount; i++)
{
temp += weights[i] * inputs[i];
}
temp += bias;
sum = temp;
output = ActivationFunction(sum);
}
void InitializeWeights()
{
for(int i=0; i<inputCount; i++)
{
weights[i] = rand() % 101/100;
}
}
~Neuron()
{
delete[] weights;
}
};
Я также другая структура под названием «Слой», который представляет собой слой. Нейроны инициализируются там -
for(int i=0; i<neuronCount; i++)
{
neurons[i] = Neuron(inputCount);
}
, где «neuronCount» является количество нейронов в слое. Проблема в том, что весовой массив в нейронах немедленно освобождается из-за вызова деструктора. Что я должен сделать, чтобы предотвратить это? Что еще более важно, есть ли лучший способ разработать мою программу?
Не могли бы вы предоставить источник класса «Слой»? – pSoLT
Сделайте себе одолжение и используйте 'std :: vector' вместо 'float *' и 'new []/delete []'. Все ваши проблемы с этим кодом будут решены, если вы это сделаете. В противном случае вам нужно реализовать [правило 3] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) –
PaulMcKenzie
Выходит ли из сферы действия? почему деструкторы называются? И можете ли вы попробовать распределить на основе кучи? но не забудьте удалить их. –