Вылетает в этой фукции:
float Neuron::Axon::getSignal() const
{
return 1 / (1 + exp(ownerNeuron->sum_function()));
}
Функция вызывается из:
float get_axon_value() const {return axon.getSignal(); }
Это функция из
vector<float> Neural_network::test(const vector<float> &in)
{
set_inputs(in);
vector<float> out(outNeurons.size());
for (int i{0}; i < outNeurons.size(); i++)
out[i] = outNeurons[i].get_axon_value();
return out;
}
Это точка входа:
Neural_network neuralNetwork;
neuralNetwork.add_input_neuron(Neural_network::Input_neuron());
neuralNetwork.add_out_neuron(Neuron(
std::vector<Neuron::Dendrite>{Neuron::Dendrite(
1,
neuralNetwork.get_input_neuron_ref(0).get_axon_ref()
)}
));
std::cout << neuralNetwork.test(std::vector<float>{1})[0];
Типы:
/* Axon is the output part of the neuron. Dentrits gets value of neuron from it's Axon.*/
class Axon{
public:
float getSignal() const;//Activation function
Neuron *ownerNeuron;
};
/* Dendrite is an input part of neuron. It has weight. It gets value from axon of neron from previous layer.*/
class Dendrite{
public:
float weight;
Axon *inputAkson;
Dendrite(float weight, Axon inAxon) : weight{weight}, inputAkson{&inAxon} {}
};
Neuron::Neuron() : axon()
{
axon.ownerNeuron = this;
dendrite.clear();
}
Neuron::Neuron(const vector<Dendrite>& dendrites) : Neuron()
{
for(Dendrite den : dendrites)
dendrite.emplace_back(den);
}
class Input_neuron : public Neuron{
public:
float sum_function(){
return value;
}
void set_value(float v) { value = v; }
private:
float value;
};
Остальные функции:
void Neural_network::add_input_neuron(const Neural_network::Input_neuron& inputNeuron) {
inNeurons.emplace_back(inputNeuron);
}
void Neural_network::add_out_neuron(const Neuron& neuron) {
outNeurons.emplace_back(neuron);
}
Neural_network::Input_neuron &Neural_network::get_input_neuron_ref(int ind) {
if (ind < 0 || ind >= inNeurons.size())
throw runtime_error("Neural_network::get_input_neuron_ref(): out of input neurons");
return inNeurons[ind];
}
Axon& get_axon_ref() { return axon; }
Нарушение Правила Трех.
Согласно вашей задумке, как я ее понял, указатель ownerNeuron
содержащийся в поле Neuron::axon
, должен в свою очередь указывать на сам Neuron
, который содержит это поле axon
. То есть каждый объект Neuron
содержит внутри указатель на самого себя. Это значит, что каждый раз, когда происходит копирование объекта типа Neuron
, необходимо исправлять указатель axon.ownerNeuron
в полученной копии.
У вашего класса Neuron
нет правильного конструктора копирования и копирующего оператора присваивания. В результате всякий раз, когда копируется объект типа Neuron
, содержащееся в нем поле axon
сохраняет прежнее значение указателя axon.ownerNeuron
. Этот указатель запросто может "протухнуть" (и "протухает"), если оригинальный Neuron
будет уничтожен. Позже, при обращении через такой висящий указатель вы получаете segfault. (И даже если оригинальный Neuron
не будет уничтожен, все равно axon.ownerNeuron
в копии будет указывать на неправльный экземпляр Neuron
).
Чтобы исправить проблему, вам придется соблюсти Правило Трех (или Пяти): написать конструктор копирования (и/или перемещения) для Neuron
и написать копирующий (и/или перемещающий) оператор присваивания для Neuron
, который будет правильно выставлять axon.ownerNeuron
в копии.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть расширение для хрома, которое обрабатывает все цвета на открытой вкладке и выводит их в popup, например вот так — rgb(192, 72, 72) и так далее
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение
Помогите отсортировать объекты в алфавитном порядке по полю name
Создаю программу и надо решить проблему: В программе есть окошко для выбора текстового файла, код: