new weights interface and addaption + mall tweaks

This commit is contained in:
2016-02-18 16:36:16 +01:00
parent 19253e975f
commit ec82018ef9
10 changed files with 101 additions and 99 deletions

View File

@@ -36,17 +36,28 @@ namespace NeuralNetwork
virtual std::string stringify(const std::string &prefix="") const =0;
/**
* @brief Gets weight
* @brief Returns weight
* @param n is neuron
*/
virtual float getWeight(const NeuronInterface &n) const =0;
virtual float weight(const NeuronInterface &n) const =0;
/**
* @brief Sets weight
* @param n is neuron
* @param w is new weight for input neuron n
* @brief Returns weight
* @param n is id of neuron
*/
virtual void setWeight(const NeuronInterface& n ,const float &w) =0;
virtual float weight(const std::size_t &n) const =0;
/**
* @brief Returns reference to weight
* @param n is neuron
*/
virtual float& weight(const NeuronInterface &n) =0;
/**
* @brief Returns reference to weight
* @param n is id of neuron
*/
virtual float& weight(const std::size_t &n) =0;
/**
* @brief Returns output of neuron
@@ -58,11 +69,6 @@ namespace NeuralNetwork
*/
virtual float value() const=0;
/**
* @brief Returns value for derivation of activation function
*/
// virtual float derivatedOutput() const=0;
/**
* @brief Function sets bias for neuron
* @param bias is new bias (initial value for neuron)
@@ -102,12 +108,12 @@ namespace NeuralNetwork
{
public:
Neuron(unsigned long _id=0, const ActivationFunction::ActivationFunction &activationFunction=ActivationFunction::Sigmoid(-4.9)):
NeuronInterface(), basis(new BasisFunction::Linear),
NeuronInterface(), id_(_id), basis(new BasisFunction::Linear),
activation(activationFunction.clone()),
id_(_id),weights(1),_output(0),_value(0) {
weights(1),_output(0),_value(0) {
}
Neuron(const Neuron &r): NeuronInterface(), basis(r.basis->clone()), activation(r.activation->clone()),id_(r.id_),
Neuron(const Neuron &r): NeuronInterface(), id_(r.id_), basis(r.basis->clone()), activation(r.activation->clone()),
weights(r.weights), _output(r._output), _value(r._value) {
}
@@ -116,38 +122,28 @@ namespace NeuralNetwork
delete activation;
};
virtual std::string stringify(const std::string &prefix="") const override;
Neuron operator=(const Neuron&) = delete;
Neuron& operator=(const Neuron&r) {
id_=r.id_;
weights=r.weights;
basis=r.basis->clone();
activation=r.activation->clone();
return *this;
}
virtual std::string stringify(const std::string &prefix="") const override;
virtual long unsigned int id() const override {
return id_;
};
/**
* @brief Gets weight
* @param n is neuron
*/
virtual float getWeight(const NeuronInterface &n) const override {
virtual float weight(const NeuronInterface &n) const override {
return weights[n.id()];
}
/**
* @brief Sets weight
* @param n is neuron
* @param w is new weight for input neuron n
*/
virtual void setWeight(const NeuronInterface& n ,const float &w) override {
if(weights.size()<n.id()+1) {
weights.resize(n.id()+1);
}
weights[n.id()]=w;
virtual float weight(const std::size_t &n) const override {
return weights[n];
}
virtual float& weight(const NeuronInterface &n) override {
return weights[n.id()];
}
virtual float& weight(const std::size_t &n) override {
return weights[n];
}
virtual void setInputSize(const std::size_t &size) override {
@@ -196,8 +192,7 @@ namespace NeuralNetwork
}
virtual Neuron* clone() const override {
Neuron *n = new Neuron;
*n=*this;
Neuron *n = new Neuron(*this);
return n;
}
@@ -209,12 +204,12 @@ namespace NeuralNetwork
return *activation;
}
const unsigned long id_;
protected:
BasisFunction::BasisFunction *basis;
ActivationFunction::ActivationFunction *activation;
unsigned long id_;
std::vector<float> weights;
float _output;
@@ -238,14 +233,16 @@ namespace NeuralNetwork
virtual float getBias() const override { return 0; };
virtual float getWeight(const NeuronInterface&) const override { return 0; }
float a=0.0;
virtual float& weight(const NeuronInterface &) override { return a; }
virtual float& weight(const std::size_t &) override { return a; }
virtual float weight(const NeuronInterface&) const override { return 0; }
virtual float weight(const std::size_t&) const override { return 0; }
virtual void setBias(const float&) override{ }
virtual float output() const override { return 1.0; };
virtual void setWeight(const NeuronInterface&, const float&) override { }
virtual std::string stringify(const std::string& prefix = "") const override { return prefix+"{ \"class\" : \"NeuralNetwork::BiasNeuron\" }"; }
virtual float value() const override { return 1.0; }
@@ -290,14 +287,16 @@ namespace NeuralNetwork
virtual float getBias() const override { return 0; };
virtual float getWeight(const NeuronInterface&) const override { return 0; }
float a=0.0;
virtual float& weight(const NeuronInterface &) override { return a; }
virtual float& weight(const std::size_t &) override { return a; }
virtual float weight(const NeuronInterface&) const override { return 0; }
virtual float weight(const std::size_t&) const override { return 0; }
virtual void setBias(const float&) override{ }
virtual float output() const override { return 1.0; };
virtual void setWeight(const NeuronInterface&, const float&) override { }
virtual std::string stringify(const std::string& prefix = "") const override { return prefix+"{ \"class\" : \"NeuralNetwork::InputNeuron\", \"id\": "+std::to_string(id_)+" }"; }
virtual float value() const override { return 1.0; }

View File

@@ -24,7 +24,7 @@ namespace Recurrent {
* @param _outputSize is size of output from network
* @param hiddenUnits is number of hiddenUnits to be created
*/
inline Network(size_t _inputSize, size_t _outputSize,size_t hiddenUnits=0):NeuralNetwork::Network(),inputSize(_inputSize),outputSize(_outputSize), neurons(0) {
inline Network(size_t _inputSize, size_t _outputSize,size_t hiddenUnits=0):NeuralNetwork::Network(),inputSize(_inputSize),outputSize(_outputSize), neurons(0),outputs(0) {
neurons.push_back(new NeuralNetwork::BiasNeuron());
for(size_t i=0;i<_inputSize;i++) {
@@ -78,7 +78,7 @@ namespace Recurrent {
neurons.push_back(new Neuron(neurons.size()));
NeuronInterface *newNeuron=neurons.back();
for(std::size_t i=0;i<neurons.size();i++) {
neurons[i]->setWeight(*newNeuron,0.0);
neurons[i]->setInputSize(newNeuron->id()+1);
}
return *newNeuron;
}
@@ -95,6 +95,7 @@ namespace Recurrent {
size_t outputSize=0;
std::vector<NeuronInterface*> neurons;
std::vector<float> outputs;
};
}
}