Я пишу нейронную сеть на C ++ для аппроксимации функции xSin (x), используя один скрытый слой с 5 скрытыми нейронами. Скрытые нейроны используют активацию tanh, а выходной слой использует активацию Linear. Я использовал 30 обучающих примеров для 10 000 эпох.
Пока я не перетасовал свои данные, я получил следующее: (КРАСНЫЙ: прогнозируемые данные, ЗЕЛЕНЫЙ: фактические данные), также MSE была близка к 0
Но когда я перемешиваю индексы обучающих примеров и проверяю, что мое перемешивание действительно перемешивается, я получаю ужасные результаты:
и Ошибка против эпохи как:
Что возможно могло пойти не так? Может ли это быть причиной перетасовки?
Вот простой код для справки
//Shuffle Function
void shuffle(int *array, size_t n)
{
if (n > 1) //If no. of training examples > 1
{
size_t i;
for (i = 0; i < n - 1; i++)
{
size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
int t = array[j];
array[j] = array[i];
array[i] = t;
}
}
}
int main(int argc, const char * argv[])
{
//Some other actions
///FOR INDEX SHUFFLING
int trainingSetOrder[numTrainingSets];
for(int j=0; j<numTrainingSets; ++j)
trainingSetOrder[j] = j;
///TRAINING
//std::cout<<"start train\n";
vector<double> performance, epo; ///STORE MSE, EPOCH
for (int n=0; n < epoch; n++)
{
shuffle(trainingSetOrder,numTrainingSets);
for (int i=0; i<numTrainingSets; i++)
{
int x = trainingSetOrder[i];
//cout<<" "<<"("<<training_inputs[x][0]<<","<<training_outputs[x][0] <<")";
/// Forward pass
for (int j=0; j<numHiddenNodes; j++)
{
double activation=hiddenLayerBias[j];
//std::cout<<"Training Set :"<<x<<"\n";
for (int k=0; k<numInputs; k++) {
activation+=training_inputs[x][k]*hiddenWeights[k][j];
}
hiddenLayer[j] = tanh(activation);
}
for (int j=0; j<numOutputs; j++) {
double activation=outputLayerBias[j];
for (int k=0; k<numHiddenNodes; k++)
{
activation+=hiddenLayer[k]*outputWeights[k][j];
}
outputLayer[j] = lin(activation);
}
/// Backprop
/// For V
double deltaOutput[numOutputs];
for (int j=0; j<numOutputs; j++) {
double errorOutput = (training_outputs[i][j]-outputLayer[j]);
deltaOutput[j] = errorOutput*dlin(outputLayer[j]);
}
/// For W
//Some Code
///Updation
/// For V and b
///Some Code
/// For W and c
for (int j=0; j<numHiddenNodes; j++) {
//c
hiddenLayerBias[j] += deltaHidden[j]*lr;
//W
for(int k=0; k<numInputs; k++) {
hiddenWeights[k][j]+=training_inputs[i][k]*deltaHidden[j]*lr;
}
}
}
}
return 0;
}