tweaking speed

This commit is contained in:
2016-05-08 12:09:24 +02:00
parent 4b42a8c310
commit 79d094e1cb
6 changed files with 131 additions and 107 deletions

View File

@@ -3,7 +3,9 @@
SIMPLEJSON_REGISTER_FINISH(NeuralNetwork::FeedForward::Layer::Factory, NeuralNetwork::FeedForward::Layer,NeuralNetwork::FeedForward::Layer::deserialize)
void NeuralNetwork::FeedForward::Layer::solve(const std::vector<float> &input, std::vector<float> &output) {
output.resize(neurons.size());
if(output.size() < neurons.size()) {
output.resize(neurons.size());
}
for(auto&neuron: neurons) {
output[neuron->id] = neuron->operator()(input);

View File

@@ -3,21 +3,18 @@
SIMPLEJSON_REGISTER_FINISH(NeuralNetwork::FeedForward::Network::Factory, NeuralNetwork::FeedForward::Network,NeuralNetwork::FeedForward::Network::deserialize)
std::vector<float> NeuralNetwork::FeedForward::Network::computeOutput(const std::vector<float>& input) {
std::vector<float> partialInput(input.size()+1);
std::vector<float> partialOutput;
// 0 is bias
partialInput[0]=1.0;
_partialInput[0]=1.0;
for(std::size_t i=0;i<input.size();i++) {
partialInput[i+1]=input[i];
_partialInput[i+1]=input[i];
}
for(std::size_t i=1;i<layers.size();i++) {
layers[i]->solve(partialInput,partialOutput);
partialInput.swap(partialOutput);
layers[i]->solve(_partialInput,_partialOutput);
_partialInput.swap(_partialOutput);
}
return std::vector<float>(partialInput.begin()+1,partialInput.end());
return std::vector<float>(_partialInput.begin()+1,_partialInput.begin()+outputs()+1);
}
void NeuralNetwork::FeedForward::Network::randomizeWeights() {
@@ -44,6 +41,15 @@ std::unique_ptr<NeuralNetwork::FeedForward::Network> NeuralNetwork::FeedForward:
for(auto& layerObject: obj["layers"].as<SimpleJSON::Type::Array>()) {
network->layers.push_back(NeuralNetwork::FeedForward::Layer::Factory::deserialize(layerObject.as<SimpleJSON::Type::Object>()).release());
if(network->_partialInput.size() < network->layers.back()->size()) {
network->_partialInput.resize(network->layers.back()->size());
}
if(network->_partialOutput.size() < network->layers.back()->size()) {
network->_partialOutput.resize(network->layers.back()->size());
}
}
network->_inputs=network->layers[0]->size()-1;

View File

@@ -7,17 +7,17 @@ std::vector<float> NeuralNetwork::Recurrent::Network::computeOutput(const std::v
assert(input.size() == _inputs);
if(outputs.size() != neurons.size()) {
outputs.resize(neurons.size());
if(_outputsOfNeurons.size() != neurons.size()) {
_outputsOfNeurons.resize(neurons.size());
for(auto &neuron:neurons) {
outputs[neuron->id]=neuron->output();
_outputsOfNeurons[neuron->id]=neuron->output();
}
}
std::vector<float> newOutputs(neurons.size());
for(size_t i=0;i<_inputs;i++) {
outputs[i+1]=input[i];
_outputsOfNeurons[i+1]=input[i];
newOutputs[i+1]=input[i];
}
@@ -27,9 +27,9 @@ std::vector<float> NeuralNetwork::Recurrent::Network::computeOutput(const std::v
for(unsigned int iter=0;iter< iterations;iter++) {
for(size_t i=_inputs+1;i<neuronsSize;i++) {
newOutputs[i] = neurons[i]->operator()(outputs);
newOutputs[i] = neurons[i]->operator()(_outputsOfNeurons);
}
outputs.swap(newOutputs);
_outputsOfNeurons.swap(newOutputs);
}
std::vector<float> ret;
@@ -40,7 +40,7 @@ std::vector<float> NeuralNetwork::Recurrent::Network::computeOutput(const std::v
return ret;
}
NeuralNetwork::Recurrent::Network NeuralNetwork::Recurrent::Network::connectWith(const NeuralNetwork::Recurrent::Network &r) const {
NeuralNetwork::Recurrent::Network NeuralNetwork::Recurrent::Network::connectWith(const NeuralNetwork::Recurrent::Network &) const {
}
@@ -68,7 +68,7 @@ SimpleJSON::Type::Object NeuralNetwork::Recurrent::Network::serialize() const {
{"class", "NeuralNetwork::Recurrent::Network"},
{"inputSize", _inputs},
{"outputSize", _outputs},
{"outputs", outputs},
{"outputs", _outputsOfNeurons},
{"neurons", neuronsSerialized}
};
}