Bonjour,
ça fait pas mal de temps que je bosse sur un réseau de neurones sur GPU avec OpenCL, je pensait enfin arriver au bout mais là je bloque :
Après plusieurs itérations les sorties sont sensées s'approcher des sorties idéales mais au lieu de ça elles s'approchent de -1 ou 1
Mais ce n'est pas tout : au bout n'un nombre d’itérations qui semble aléatoire (entre 60 et 100 en général), toutes les sorties seront "#QNaN"
Je me dit que peut être les 2 problèmes sont liés...
Qu'est-ce qui pourrait causer un QNaN ?
Ma carte graphique est une Nvidia gtx 1060, mes drivers sont a jour et le problème est toujours présent en exécutant le programme sur mon processeur (toujours avec avec OpenCL)
Je met un bout de code mais vu comme il est sale je doute que ça soit vraiment utile :/
kernel backpropagation : exécuté sur chaque neurone d'une couche, couche après couche.
kernel feedforward, pareil :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 __kernel void back1(__constant float* outputs, __constant float* excepted, __global float* buffer, __constant float* weightsBuffer, __global float* newWeightsBuffer, int offset, int weightsOffset, int weightsOffset2, int inputNbr, int outputNbr, int deltaOffset, int neuroneNbr, int outLayer, float learningRate){ size_t id = get_global_id(0); float D = 0.0f; float S = 0.0f; float O = outputs[offset + id]; if (outLayer){ float T = excepted[id]; D = (O - T)*(1.0f - (O*O)); buffer[id] = D; } else{ for (int i = 0; i < outputNbr; ++i){ S += weightsBuffer[weightsOffset2 + i + outputNbr*id] * buffer[deltaOffset + i]; } D = S*(1.0f - O*O); buffer[id] = D; } for (int i = 0; i < inputNbr; ++i){ newWeightsBuffer[weightsOffset + id + neuroneNbr*i] = weightsBuffer[weightsOffset + id + neuroneNbr*i] - (outputs[offset - inputNbr + i]*D*learningRate); } }
Merci d'avance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 __kernel void feedforward(__constant float* weights, __global float* inputs, int inputNbr, int offset, int offsetWeights){ float t = 0.0f; float e = 0.0f; for (int i = 0; i < inputNbr; ++i){ t += (weights[(get_global_id(0) * inputNbr) + i + offsetWeights] * inputs[offset - inputNbr + i]); } e = exp(t*2.0f); t = (e - 1.0f) / (e + 1.0f); inputs[offset + get_global_id(0)] = t; }
Partager