/*
	Experimento usando 7 grupos para treino, 1 grupo para validacao e teste. Este ultimo eh dividido
	em dois grupos, um com (n - 1) individuos para validacao e (1) individuo para teste.
*/
void train(){
	string solver = dataPath + "solver.prototxt";
	string resultsPath = dataPath + "results/";

	for(int grupoTeste = 1; grupoTeste <= qtdeGrupos; grupoTeste++){
		TrainData dadosTreino;
		dadosTreino.testSet = grupoTeste;
		//Garante que so vai separar em treino e teste, nao vai ter validacao
		dadosTreino.validationSet = 99;
		readTrainData(&dadosTreino);
		for(int individuo = 1; individuo <= dadosTreino.IndividuosTeste.size(); individuo++){
			double bstValidationAccuracy = 0, mediaNormal = 0, mediaBinario = 0;
			vector<Mat> imagensValidacao, imagensTeste;
			vector<int> labelsValidacao, labelsTeste;
			separarIndividuo(dadosTreino.testSamples, dadosTreino.testLabels,
					  individuo - 1, imagensValidacao,
					  labelsValidacao, imagensTeste,
					  labelsTeste, dadosTreino.IndividuosTeste);
			//Embaralha e trunca os dados de validacao
			shuffleVectors(imagensValidacao, labelsValidacao);
			while(imagensValidacao.size() % 55 != 0){
				imagensValidacao.erase(imagensValidacao.begin());
				labelsValidacao.erase(labelsValidacao.begin());
			}
			for(int iter = 1; iter <= qtdeIteracoes; iter++){
				shuffleVectors(dadosTreino.trainSamples, dadosTreino.trainLabels);
				trainNet(solver, dadosTreino.trainSamples, dadosTreino.trainLabels, imagensValidacao, labelsValidacao);

				executarTeste(resultsPath, grupoTeste, grupoTeste, iter, imagensTeste, labelsTeste, individuo);
			}
		}
	}
}
Example #2
0
void Net::testNet(NetParam& param) {
    shared_ptr<Blob> X_batch(new Blob(X_train_->subBlob(0, 1)));
    shared_ptr<Blob> Y_batch(new Blob(Y_train_->subBlob(0, 1)));
    trainNet(X_batch, Y_batch, param);
    cout << "BEGIN TEST LAYERS" << endl;
    for (int i = 0; i < (int)layers_.size(); ++i) {
        testLayer(param, i);
        printf("\n");
    }
}
Example #3
0
int main(int argc, char **argv)
{  
  double *netout = malloc(sizeof(double) * NUM_O); // what the network thinks
  double *hidout = malloc(sizeof(double) * NUM_H); // results from hidden layer
  sumsh = malloc(sizeof(double) * NUM_H); // weighted summations for hidden layer
  sumso = malloc(sizeof(double) * NUM_O); // weighted summations for output layer
  
  srand(time(NULL)*getpid());
  
  /* initialize the weights; small, random values */
  wih = initWeights(NUM_I, NUM_H); // weights between input and hidden layer
  who = initWeights(NUM_H, NUM_O); // weights between hidden and output layer
  
  /* train this thing. */
  printf("%s\n", trainNet(netout, hidout) ? "Epoch limit exceeded!" : "Neural network trained and ready to go.");
  
  free(sumsh); free(sumso); free(wih); free(who);

  return 0;
}
Example #4
0
void Net::train(NetParam& param) {
    // to be delete
    int N = X_train_->get_N();
    int iter_per_epochs;
    if (param.use_batch) {
        iter_per_epochs = N / param.batch_size;
    }
    else {
        iter_per_epochs = N;
    }
    int num_iters = iter_per_epochs * param.num_epochs;
    int epoch = 0;

    // iteration
    for (int iter = 0; iter < num_iters; ++iter) {
        // batch
        shared_ptr<Blob> X_batch;
        shared_ptr<Blob> Y_batch;
        if (param.use_batch) {
            // deep copy
            X_batch.reset(new Blob(X_train_->subBlob((iter * param.batch_size) % N,
                                                        ((iter+1) * param.batch_size) % N)));
            Y_batch.reset(new Blob(Y_train_->subBlob((iter * param.batch_size) % N,
                                                        ((iter+1) * param.batch_size) % N)));
        }
        else {
            shared_ptr<Blob> X_batch = X_train_;
            shared_ptr<Blob> Y_batch = Y_train_;
        }

        // train
        trainNet(X_batch, Y_batch, param);

        // update
        for (int i = 0; i < (int)layers_.size(); ++i) {
            std::string lname = layers_[i];
            if (!data_[lname][1] || !data_[lname][2]) {
                continue;
            }
            for (int j = 1; j <= 2; ++j) {
                assert(param.update == "momentum" ||
                       param.update == "rmsprop" ||
                       param.update == "adagrad" ||
                       param.update == "sgd");
                shared_ptr<Blob> dx(new Blob(data_[lname][j]->size()));
                if (param.update == "sgd") {
                    *dx = -param.lr * (*grads_[lname][j]);
                }
                if (param.update == "momentum") {
                    if (!step_cache_[lname][j]) {
                        step_cache_[lname][j].reset(new Blob(data_[lname][j]->size(), TZEROS));
                    }
                    Blob ll = param.momentum * (*step_cache_[lname][j]);
                    Blob rr = param.lr * (*grads_[lname][j]);
                    *dx = ll - rr;
                    step_cache_[lname][j] = dx;
                }
                if (param.update == "rmsprop") {
                    // change it self
                    double decay_rate = 0.99;
                    if (!step_cache_[lname][j]) {
                        step_cache_[lname][j].reset(new Blob(data_[lname][j]->size(), TZEROS));
                    }
                    Blob r1 = decay_rate * (*step_cache_[lname][j]);
                    Blob r2 = (1 - decay_rate) * (*grads_[lname][j]);
                    Blob r3 = r2 * (*grads_[lname][j]);
                    *step_cache_[lname][j] = r1 + r3;
                    Blob d1 = (*step_cache_[lname][j]) + 1e-8;
                    Blob u1 = param.lr * (*grads_[lname][j]);
                    Blob d2 = mini_net::sqrt(d1);
                    Blob r4 = u1 / d2;
                    *dx = 0 - r4;
                }
                if (param.update == "adagrad") {
                    if (!step_cache_[lname][j]) {
                        step_cache_[lname][j].reset(new Blob(data_[lname][j]->size(), TZEROS));
                    }
                    *step_cache_[lname][j] = (*grads_[lname][j]) * (*grads_[lname][j]);
                    Blob d1 = (*step_cache_[lname][j]) + 1e-8;
                    Blob u1 = param.lr * (*grads_[lname][j]);
                    Blob d2 = mini_net::sqrt(d1);
                    Blob r4 = u1 / d2;
                    *dx = 0 - r4;
                }
                *data_[lname][j] = (*data_[lname][j]) + (*dx);
            }
        }

        // evaluate
        bool first_it = (iter == 0);
        bool epoch_end = (iter + 1) % iter_per_epochs == 0;
        bool acc_check = (param.acc_frequence && (iter+1) % param.acc_frequence == 0);
        if (first_it || epoch_end || acc_check) {
            // update learning rate[TODO]
            if ((iter > 0 && epoch_end) || param.acc_update_lr) {
                param.lr *= param.lr_decay;
                if (epoch_end) {
                    epoch++;
                }
            }

            // evaluate train set accuracy
            shared_ptr<Blob> X_train_subset;
            shared_ptr<Blob> Y_train_subset;
            if (N > 1000) {
                X_train_subset.reset(new Blob(X_train_->subBlob(0, 100)));
                Y_train_subset.reset(new Blob(Y_train_->subBlob(0, 100)));
            }
            else {
                X_train_subset = X_train_;
                Y_train_subset = Y_train_;
            }
            trainNet(X_train_subset, Y_train_subset, param, "forward");
            double train_acc = prob(*data_[layers_.back()][1], *data_[layers_.back()][0]);
            train_acc_history_.push_back(train_acc);

            // evaluate val set accuracy[TODO: change train to val]
            trainNet(X_val_, Y_val_, param, "forward");
            double val_acc = prob(*data_[layers_.back()][1], *data_[layers_.back()][0]);
            val_acc_history_.push_back(val_acc);

            // print
            printf("iter: %d  loss: %f  train_acc: %0.2f%%    val_acc: %0.2f%%    lr: %0.6f\n",
                    iter, loss_, train_acc*100, val_acc*100, param.lr);

            // save best model[TODO]
            //if (val_acc_history_.size() > 1 && val_acc < val_acc_history_[val_acc_history_.size()-2]) {
            //    for (auto i : layers_) {
            //        if (!data_[i][1] || !data_[i][2]) {
            //            continue;
            //        }
            //        best_model_[i][1] = data_[i][1];
            //        best_model_[i][2] = data_[i][2];
            //    }
            //}
        }
    }

    return;
}
Example #5
0
int main() {

    double inputs[MAX_NO_OF_INPUTS];
    double outputTargets[MAX_NO_OF_OUTPUTS];

    /* determine layer paramaters */
    int noOfLayers = 2; // input layer excluded
    int noOfNeurons[] = {10,1};
    int noOfInputs[] = {2,10};
    char axonFamilies[] = {'g','l'};
    double actFuncFlatnesses[] = {1,1,1};

    createNet(noOfLayers, noOfNeurons, noOfInputs, axonFamilies, actFuncFlatnesses, 1);

    /* train it using batch method */
    int i;
    double tempTotal1, tempTotal2;
    int counter = 0;
    for(i = 0; i < TRAINING_ITERATION; i++) {
        inputs[0] = getRand();
        inputs[1] = getRand();
        inputs[2] = getRand();
        inputs[3] = getRand();
        tempTotal1 = inputs[0] + inputs[1];
        tempTotal2 = inputs[2] - inputs[3];
        // tempTotal = inputs[0] + inputs[1];
        feedNetInputs(inputs);
        updateNetOutput();
        // outputTargets[0] = sin(tempTotal1)*2+0.5*exp(tempTotal2)-cos(inputs[1]+inputs[3])/2;
        outputTargets[0] = sin(tempTotal1)*2+0.5*exp(tempTotal2);
 //       outputTargets[1] = (double)cos(tempTotal);
        /* train using batch training ( don't update weights, just cumulate them ) */
        //trainNet(0, 0, 1, outputTargets);
        trainNet(0, 0, 1, outputTargets);
        counter++;
        /* apply batch changes after 100 loops use .8 learning rate and .8 momentum */
        if(counter == 100) { applyBatchCumulations(.3,.3); counter = 0;}  //!~~~swd: should be within (0,1)
    }

    /* test it */
    double *outputs;
    double target_out[50];
    double actual_out[50];
    printf("Sin Target \t Output \n");
    printf("---------- \t -------- \t ---------- \t --------\n");
    for(i = 0; i < 50; i++) {
        inputs[0] = getRand();
        inputs[1] = getRand();
        inputs[2] = getRand();
        inputs[3] = getRand();
        tempTotal1 = inputs[0] + inputs[1];
        tempTotal2 = inputs[2] - inputs[3];

	target_out[i] = sin(tempTotal1)*2+0.5*exp(tempTotal2);
    // target_out[i] = sin(tempTotal1)*2+0.5*exp(tempTotal2)-cos(inputs[1]+inputs[3])/2;

        feedNetInputs(inputs);
        updateNetOutput();
        outputs = getOutputs();

	actual_out[i] = outputs[0];
	

        printf( "%f \t %f \n", target_out[i], actual_out[i]);
    }
    
    float Rsquared_ans=Rsquared(target_out, actual_out, 50);
    printf("Result Summary: \n");
    printf("The Rsquared Value is : %f \n", Rsquared_ans);
    printf("finish!!!\n");

    //getch();
    return 0;

}