moving bassis function out of network
This commit is contained in:
@@ -56,11 +56,9 @@ FeedForward::FeedForward(std::initializer_list<size_t> s, double lam, FeedForwar
|
|||||||
outputs[i]= new float[layeSize];
|
outputs[i]= new float[layeSize];
|
||||||
inputs[i]= new float[layeSize];
|
inputs[i]= new float[layeSize];
|
||||||
|
|
||||||
potentials[i][0]=1.0;
|
|
||||||
outputs[i][0]=1.0;
|
outputs[i][0]=1.0;
|
||||||
for (int j=1;j<layeSize;j++)
|
for (int j=1;j<layeSize;j++)
|
||||||
{
|
{
|
||||||
potentials[i][j]=1.0;
|
|
||||||
weights[i][j]= new float[prev_size];
|
weights[i][j]= new float[prev_size];
|
||||||
for(int k=0;k<prev_size;k++)
|
for(int k=0;k<prev_size;k++)
|
||||||
{
|
{
|
||||||
@@ -111,35 +109,10 @@ void FeedForward::solvePart(float *newSolution, register size_t begin, size_t en
|
|||||||
if(prevSize >=4 && function !=nullptr)
|
if(prevSize >=4 && function !=nullptr)
|
||||||
{
|
{
|
||||||
__m128 partialSolution;
|
__m128 partialSolution;
|
||||||
__m128 w;
|
size_t alignedPrev=prevSize>16?(prevSize-(prevSize%16)):0;
|
||||||
__m128 sols;
|
|
||||||
register size_t alignedPrev=prevSize>16?(prevSize-(prevSize%16)):0;
|
|
||||||
for( size_t j=begin;j<end;j++)
|
for( size_t j=begin;j<end;j++)
|
||||||
{
|
{
|
||||||
partialSolution= _mm_setzero_ps();
|
partialSolution=basisFunction(prevSize,weights[layer][j],sol,alignedPrev);
|
||||||
w=_mm_setzero_ps();
|
|
||||||
for(register size_t k=alignedPrev;k<prevSize;k++)
|
|
||||||
{
|
|
||||||
w = _mm_load_ss(this->weights[layer][j]+k);
|
|
||||||
sols = _mm_load_ss(sol+k);
|
|
||||||
w=_mm_mul_ps(w,sols);
|
|
||||||
partialSolution=_mm_add_ps(partialSolution,w);
|
|
||||||
}
|
|
||||||
register float* memory=this->weights[layer][j];
|
|
||||||
for(register size_t k=0;k<alignedPrev;k+=sizeof(float))
|
|
||||||
{
|
|
||||||
w = _mm_load_ps(memory+k);
|
|
||||||
sols = _mm_load_ps(sol+k);
|
|
||||||
w=_mm_mul_ps(w,sols);
|
|
||||||
partialSolution=_mm_add_ps(partialSolution,w);
|
|
||||||
}
|
|
||||||
#ifdef USE_SSE2 //pre-SSE3 solution
|
|
||||||
partialSolution= _mm_add_ps(_mm_movehl_ps(partialSolution, partialSolution), partialSolution);
|
|
||||||
partialSolution=_mm_add_ss(partialSolution, _mm_shuffle_ps(partialSolution,partialSolution, 1));
|
|
||||||
#else
|
|
||||||
partialSolution = _mm_hadd_ps(partialSolution, partialSolution);
|
|
||||||
partialSolution = _mm_hadd_ps(partialSolution, partialSolution);
|
|
||||||
#endif
|
|
||||||
_mm_store_ss(inputs[layer]+j,partialSolution);
|
_mm_store_ss(inputs[layer]+j,partialSolution);
|
||||||
partialSolution=function->operator()(partialSolution);
|
partialSolution=function->operator()(partialSolution);
|
||||||
_mm_store_ss(newSolution+j,partialSolution);
|
_mm_store_ss(newSolution+j,partialSolution);
|
||||||
@@ -148,11 +121,7 @@ void FeedForward::solvePart(float *newSolution, register size_t begin, size_t en
|
|||||||
{
|
{
|
||||||
for( size_t j=begin;j<end;j++)
|
for( size_t j=begin;j<end;j++)
|
||||||
{
|
{
|
||||||
float tmp=0;
|
const float tmp=basisFunction(prevSize,weights[layer][j],sol);
|
||||||
for(register size_t k=0;k<prevSize;k++)
|
|
||||||
{
|
|
||||||
tmp+=sol[k]*weights[layer][j][k];
|
|
||||||
}
|
|
||||||
inputs[layer][j]=tmp;
|
inputs[layer][j]=tmp;
|
||||||
newSolution[j]=transfer[layer]->operator()(tmp);
|
newSolution[j]=transfer[layer]->operator()(tmp);
|
||||||
}
|
}
|
||||||
@@ -176,7 +145,7 @@ Shin::Solution FeedForward::solve(const Shin::Problem& p)
|
|||||||
for(register size_t i=1;i<layers;i++)
|
for(register size_t i=1;i<layers;i++)
|
||||||
{
|
{
|
||||||
float* newSolution= outputs[i];
|
float* newSolution= outputs[i];
|
||||||
if(threads > 1 && (layerSizes[i] > 700 ||prevSize > 700)) // 700 is an guess about actual size, when creating thread has some speedup
|
if(threads > 1 && (layerSizes[i] > 700 || prevSize > 700)) // 700 is an guess about actual size, when creating thread has some speedup
|
||||||
{
|
{
|
||||||
std::vector<std::thread> th;
|
std::vector<std::thread> th;
|
||||||
size_t s=1;
|
size_t s=1;
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
#include "ActivationFunction/Sigmoid.h"
|
#include "ActivationFunction/Sigmoid.h"
|
||||||
#include "ActivationFunction/ActivationFunction.h"
|
#include "ActivationFunction/ActivationFunction.h"
|
||||||
|
#include "BasisFunction/BasisFunction.h"
|
||||||
|
#include "BasisFunction/FeedForward.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
@@ -132,6 +134,7 @@ namespace NeuralNetwork
|
|||||||
float **outputs=nullptr;
|
float **outputs=nullptr;
|
||||||
float **inputs=nullptr;
|
float **inputs=nullptr;
|
||||||
ActivationFunction::ActivationFunction **transfer=nullptr;
|
ActivationFunction::ActivationFunction **transfer=nullptr;
|
||||||
|
BasisFunction::FeedForward basisFunction =BasisFunction::FeedForward();
|
||||||
size_t *layerSizes=nullptr;
|
size_t *layerSizes=nullptr;
|
||||||
size_t layers;/**< Number of layers */
|
size_t layers;/**< Number of layers */
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user