From 9f649196764e6045400fddbbf94a7d882c099876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asr=C4=B1n=20Do=C4=9Fan?= <33391270+Syntriax@users.noreply.github.com> Date: Fri, 13 Dec 2019 16:15:44 +0300 Subject: [PATCH] Initial Commit --- main.cpp | 483 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 483 insertions(+) create mode 100644 main.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..3893bab --- /dev/null +++ b/main.cpp @@ -0,0 +1,483 @@ +#include +#include +#include + + +float RandomFloat(int min, int max) +{ + static unsigned long int counter = 0; + srand(time(0) + counter++ * 50); + int value = (rand() % ((max - min) * 100)); + return (float)value / 100.0 + (float)min + 1.0; +} + +#pragma region Sinaps + class Sinaps + { + private: + float weight; // Ağırlık + float value; // Değer + float bias; // Öteleme + public: + Sinaps(); + Sinaps(float, float, float); // Kaydedilen değerleri yeniden yazabilmek için + void SetSinaps(float, float, float); // Sonradan tamamen değiştirebilmek için + void SetWeight(float); + void SetValue(float); + void SetBias(float); + float Fire(); + }; + + Sinaps::Sinaps() { weight = value = bias = 0.0; } + Sinaps::Sinaps(float weight, float value, float bias) + { + this -> weight = weight; + this -> value = value; + this -> bias = bias; + } + + void Sinaps::SetSinaps(float weight, float value, float bias) { + std::cout << "weight = " << weight << "\n"; + std::cout << "value = " << value << "\n"; + std::cout << "bias = " << bias << "\n"; + Sinaps(weight, value, bias); } + void Sinaps::SetWeight(float weight) { this -> weight = weight; } + void Sinaps::SetValue(float value) { std::cout << value << "\n"; this -> value = value; } + void Sinaps::SetBias(float bias) { this -> bias = bias; } + + float Sinaps::Fire() { return weight * value + bias; } +#pragma endregion +#pragma region Noron + class Noron + { + private: + Sinaps *forwards; + Sinaps *incoming; + int forwardsCount; + int incomingCount; + public: + Noron(); + ~Noron(); + bool SetForwards(Sinaps *, int); + bool SetIncoming(Sinaps *, int); + float GetStatus(); + }; + + Noron::Noron() + { + forwards = incoming = NULL; + forwardsCount = incomingCount = 0; + } + + Noron::~Noron() + { + delete forwards; + delete incoming; + } + + bool Noron::SetForwards(Sinaps *newForwards, int size) + { + forwards = (Sinaps *) new char[sizeof(Sinaps) * size]; + + if(!forwards) return false; + + for (int i = 0; i < size; i++) + *(forwards+i) = *(newForwards+i); + + forwardsCount = size; + return true; + } + + bool Noron::SetIncoming(Sinaps *newIncoming, int size) + { + incoming = (Sinaps *) new char[sizeof(Sinaps) * size]; + + if(!incoming) return false; + + for (int i = 0; i < size; i++) + *(incoming+i) = *(newIncoming+i); + + incomingCount = size; + return true; + } + + float Noron::GetStatus() + { + float toplam = 0.0; + std::cout << toplam << "\n"; + for (int i = 0; i < incomingCount; i++) + toplam += (incoming + i) -> Fire(); + + for (int i = 0; i < forwardsCount; i++) + (forwards + i) -> SetValue(toplam); + + return toplam; + } +#pragma endregion +#pragma region Katman + class Katman + { + protected: + Noron *neurons; + Katman *forward; + Sinaps *layerSinapses; + int size; + Sinaps *CreateSinapsSet(int size); + public: + Katman(); + Katman(int); + ~Katman(); + void FireLayer(); + void RandomizeSinapsValues(); + bool SetForward(Katman *); + bool SetIncoming(Sinaps *sinapsSet, int backwardsNeuronCount); + bool SetNoron(Noron *, int); + bool CreateNoron(int); + int GetSize(); + }; + + Katman::Katman() { neurons = NULL; this -> size = 0; } + Katman::Katman(int size) + { + Katman(); + + if(!CreateNoron(size)) + std::cout << "Katman Oluşturulamadı!"; + else + this -> size = size; + } + Katman::~Katman() { delete neurons; } + + + Sinaps *Katman::CreateSinapsSet(int size) + { + Sinaps* sinapses = (Sinaps *) new char[sizeof(Sinaps) * size]; + + if(sinapses) + for (int i = 0; i < size; i++) + *(sinapses + i) = Sinaps(); + + return sinapses; + } + void Katman::RandomizeSinapsValues() + { + if(!forward) + return; + + int sinapsCount = size * (forward -> GetSize()); + for (int i = 0; i < sinapsCount; i++) + { + (layerSinapses + i) -> SetSinaps( + RandomFloat(-5, 5), + RandomFloat(-5, 5), + RandomFloat(-5, 5) + ); + } + } + + void Katman::FireLayer() + { + for (int i = 0; i < size; i++) + std::cout << i << ". Fire = " << (neurons + i) -> GetStatus() << "\n"; + } + + bool Katman::SetForward(Katman *forward) + { + Sinaps *sinapses = NULL; // Pointer to store all created sinapses + Sinaps *newSinapses = NULL; // Temporary Pointer for creating each neurons' s1inapses + int forwardSize; + int sinapsesIndex = 0; + delete layerSinapses; + + this -> forward = forward; + + if(!forward) + return true; + + forwardSize = forward -> GetSize(); + + sinapses = (Sinaps *) new char[sizeof(Sinaps) * size * forwardSize]; + + if(!sinapses) + return false; + + // Set Forwards of each neuron in the Layer + for (int thisCounter = 0; thisCounter < size; thisCounter++) + { + newSinapses = CreateSinapsSet(forwardSize); + + if(!newSinapses) + return false; + + (neurons + thisCounter) -> SetForwards(newSinapses, forwardSize); + + // Add each sinaps to the array + for (int forwardCounter = 0; forwardCounter < forwardSize; forwardCounter++) + *(sinapses + (sinapsesIndex++)) = *(newSinapses + forwardCounter); + } + + layerSinapses = sinapses; + // Send the sinapses to the forward layer + return forward -> SetIncoming(sinapses, size); + } + + bool Katman::SetIncoming(Sinaps *sinapsSet, int backwardsNeuronCount) + { + Sinaps *sinapses = NULL; + + sinapses = (Sinaps *) new char[sizeof(Sinaps) * backwardsNeuronCount]; + + if(!sinapses) + return false; + + for (int thisCounter = 0; thisCounter < size; thisCounter++) + { + // Add each sinaps to the array + for (int incomingCounter = 0; incomingCounter < backwardsNeuronCount; incomingCounter++) + *(sinapses + (size * thisCounter + incomingCounter)) = *(sinapsSet + incomingCounter); + + (neurons + thisCounter) -> SetIncoming(sinapses, backwardsNeuronCount); + } + + return true; + } + + bool Katman::SetNoron(Noron *newneurons, int size) + { + neurons = (Noron *) new char[sizeof(Noron) * size]; + + if(!neurons) return false; + + for (int i = 0; i < size; i++) + *(neurons+i) = *(newneurons+i); + + this -> size = size; + return true; + } + + bool Katman::CreateNoron(int size) + { + neurons = (Noron *) new char[sizeof(Noron) * size]; + + if(!neurons) return false; + + for (int i = 0; i < size; i++) + *(neurons+i) = Noron(); + + this -> size = size; + return true; + } + + int Katman::GetSize() { return size; } +#pragma endregion +#pragma region Girdi-Cikti + #pragma region Girdi + class Girdi : public Katman + { + public: + Girdi(); + Girdi(int); + void SetValue(int, float); + }; + + Girdi::Girdi() : Katman() {} + Girdi::Girdi(int size) : Katman(size) {} + + void Girdi::SetValue(int index, float value) + { + Sinaps *editedSinaps = NULL; + int forwardNeuronCount = forward -> GetSize(); + + for (int i = 0; i < forwardNeuronCount; i++) + { + editedSinaps = (layerSinapses + index * forwardNeuronCount + i); + editedSinaps -> SetValue(value); + } + } + #pragma endregion + #pragma region Cikti + class Cikti : public Katman + { + public: + Cikti(); + Cikti(int); + float GetValue(int); + }; + + Cikti::Cikti() : Katman() {} + Cikti::Cikti(int size) : Katman(size) {} + + float Cikti::GetValue(int index) + { + return (neurons + index) -> GetStatus(); + } + #pragma endregion +#pragma endregion +#pragma region NeuralNetwork + class NeuralNetwork + { + private: + Girdi *input; + Katman *hiddenLayers; + Cikti *output; + int hiddenSize; + public: + NeuralNetwork(); + NeuralNetwork(int); + ~NeuralNetwork(); + void SetInput(int, float); + void RandomizeNetworkValues(); + void FireNetwork(); + bool SetInputNeurons(int); + bool SetHiddenLayerNeurons(int, int); + bool SetOutputNeurons(int); + bool ConnectLayers(); + float GetOutputValue(int); + }; + + NeuralNetwork::NeuralNetwork() + { + hiddenSize = 0; + input = NULL; + hiddenLayers = NULL; + output = NULL; + } + + NeuralNetwork::NeuralNetwork(int hiddenSize) + { + input = new Girdi(); + hiddenLayers = new Katman[hiddenSize]; + output = new Cikti(); + + if(!input) + std::cout << "Girdi Katmani Olusturulamadi!" << "\n"; + if(!hiddenLayers) + std::cout << "Ara Katmanlar Olusturulamadi!" << "\n"; + if(!output) + std::cout << "Cikti Katmani Olusturulamadi!" << "\n"; + + if(!input || !hiddenLayers || !output) + return; + + this -> hiddenSize = hiddenSize; + } + + NeuralNetwork::~NeuralNetwork() + { + delete input; + delete hiddenLayers; + delete output; + } + + bool NeuralNetwork::SetHiddenLayerNeurons(int index, int size) + { + Noron *neurons = new Noron[size]; + + if(!neurons) + return false; + + return (hiddenLayers + index) -> SetNoron(neurons, size); + } + + bool NeuralNetwork::SetInputNeurons(int size) + { + Noron *neurons = new Noron[size]; + + if(!neurons) + return false; + + return output -> SetNoron(neurons, size); + } + + bool NeuralNetwork::SetOutputNeurons(int size) + { + Noron *neurons = new Noron[size]; + + if(!neurons) + return false; + + return input -> SetNoron(neurons, size); + } + + bool NeuralNetwork::ConnectLayers() + { + if(!input -> SetForward(hiddenLayers)) + return false; + + for (int i = 0; i < hiddenSize - 1; i++) + if(!(hiddenLayers + i) -> SetForward(hiddenLayers + i + 1)) + return false; + + if(!(hiddenLayers + hiddenSize - 1) -> SetForward(output)) + return false; + + return output -> SetForward(NULL); + } + + void NeuralNetwork::FireNetwork() + { + input -> FireLayer(); + + for (int i = 0; i < hiddenSize; i++) + (hiddenLayers + i) -> FireLayer(); + + output -> FireLayer(); + } + + void NeuralNetwork::SetInput(int index, float value) + { + if(!input) + return; + + input -> SetValue(index, value); + } + + void NeuralNetwork::RandomizeNetworkValues() + { + input -> RandomizeSinapsValues(); + + for (int i = 0; i < hiddenSize; i++) + (hiddenLayers + i) -> RandomizeSinapsValues(); + + output -> RandomizeSinapsValues(); + } + + float NeuralNetwork::GetOutputValue(int index) + { + return output -> GetValue(index); + } +#pragma endregion +int main(int argc, char const *argv[]) +{ + NeuralNetwork network(3); + + network.SetInputNeurons(1); + network.SetHiddenLayerNeurons(0, 2); + network.SetHiddenLayerNeurons(1, 3); + network.SetHiddenLayerNeurons(2, 2); + network.SetOutputNeurons(1); + + network.ConnectLayers(); + network.RandomizeNetworkValues(); + + network.SetInput(0, 1); + std::cout << "m1\n"; + + network.FireNetwork(); + std::cout << "m2\n"; + std::cout << network.GetOutputValue(0) << "\n"; + std::cout << "m3\n"; + + + + + + // Katman k1(5); + // Katman k2(3); + + // std::cout << "k1 SetForward = " << k1.SetForward(&k2) << "\n"; + // std::cout << "k2 SetForward = " << k2.SetForward(NULL) << "\n"; + // k1.FireLayer(); + // k2.FireLayer(); + return 0; +}