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];
|
||||
inputs[i]= new float[layeSize];
|
||||
|
||||
potentials[i][0]=1.0;
|
||||
outputs[i][0]=1.0;
|
||||
for (int j=1;j<layeSize;j++)
|
||||
{
|
||||
potentials[i][j]=1.0;
|
||||
weights[i][j]= new float[prev_size];
|
||||
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)
|
||||
{
|
||||
__m128 partialSolution;
|
||||
__m128 w;
|
||||
__m128 sols;
|
||||
register size_t alignedPrev=prevSize>16?(prevSize-(prevSize%16)):0;
|
||||
size_t alignedPrev=prevSize>16?(prevSize-(prevSize%16)):0;
|
||||
for( size_t j=begin;j<end;j++)
|
||||
{
|
||||
partialSolution= _mm_setzero_ps();
|
||||
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
|
||||
partialSolution=basisFunction(prevSize,weights[layer][j],sol,alignedPrev);
|
||||
_mm_store_ss(inputs[layer]+j,partialSolution);
|
||||
partialSolution=function->operator()(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++)
|
||||
{
|
||||
float tmp=0;
|
||||
for(register size_t k=0;k<prevSize;k++)
|
||||
{
|
||||
tmp+=sol[k]*weights[layer][j][k];
|
||||
}
|
||||
const float tmp=basisFunction(prevSize,weights[layer][j],sol);
|
||||
inputs[layer][j]=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++)
|
||||
{
|
||||
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;
|
||||
size_t s=1;
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
#include "ActivationFunction/Sigmoid.h"
|
||||
#include "ActivationFunction/ActivationFunction.h"
|
||||
#include "BasisFunction/BasisFunction.h"
|
||||
#include "BasisFunction/FeedForward.h"
|
||||
|
||||
#include <vector>
|
||||
#include <initializer_list>
|
||||
@@ -132,6 +134,7 @@ namespace NeuralNetwork
|
||||
float **outputs=nullptr;
|
||||
float **inputs=nullptr;
|
||||
ActivationFunction::ActivationFunction **transfer=nullptr;
|
||||
BasisFunction::FeedForward basisFunction =BasisFunction::FeedForward();
|
||||
size_t *layerSizes=nullptr;
|
||||
size_t layers;/**< Number of layers */
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user