W ramach nauki postanowiłem napisać sieć neuronową pod OpenCl.
Sieć to 3 wejścia, 1 warstwa ukryta i 1 wyjście.
Propagacja do przodu i minimalizacja błędu na wagach pomiędzy warstwą ukrytą a wyjściem działa ok.
Mam problem z napisaniem algorytmu dla minimalizacji błędu wag pomiędzy wejściem a warstwą ukrytą.
"__kernel void cost(int width, __global double* output,__global double* outputL2,__global double* prediction) {"
"int column = get_global_id(0);"
"int row = get_global_id(1);"
"prediction[row*width+column] = -((output[row*width+column])-(outputL2[row*width+column]));"
"}"
"__kernel void minSyn1(int widthPrediction,__global double* prediction,int widthOutL2,__global double* outputL2,int widthOutL1,__global double* outputL1,int widthSyn1,__global double* syn1) {"
"int columns = get_global_id(0);"
"int rows = get_global_id(1);"
"double firstDir = prediction[rows*widthPrediction+columns];"
"double secondDir = (outputL2[rows*widthOutL2+columns])*(1-(outputL2[rows*widthOutL2+columns]));"
""
"for(int i=0;i<widthOutL1;i++){"
"syn1[i] =syn1[i]-(0.01)*((outputL1[rows*widthOutL1+i])*firstDir*secondDir);"
""
"}"
""
"}"
"__kernel void minSyn0(int widthPrediction,__global double* prediction,int widthOutL2,__global double* outputL2,int widthSyn1,__global double* syn1,int widthOutL1,__global double* outputL1,int widthSyn0,__global double* syn0,int widthInput,int heightInput,__global double* input){"
"int columns = get_global_id(0);"
"int rows = get_global_id(1);"
"for(int i=0;i<widthInput;i++){"
""
"syn0[rows*widthSyn0+columns] =syn0[rows*widthSyn0+columns]-0.01*prediction[i]*outputL2[i]*(1-outputL2[i])*syn1[columns]*outputL1[rows*widthOutL1+columns]*(1-outputL1[rows*widthOutL1+columns])*input[rows*widthInput+i];"
""
"}"
"}"