void NeuralNetwork::trainOn(arma::mat& input, const arma::mat& output, int numIterations, int iterationsBetweenReport)
{
    if (input.n_cols != static_cast<unsigned int>(m_numNeuronsOnLayer[0]) ||
            output.n_cols != static_cast<unsigned int>(m_numNeuronsOnLayer[m_numLayers - 1]))
        throw InvalidInputException("File's input / output length doesn't match with the"
                                    "number of neurons on input / output layer.");

    if (m_featureNormalization)
        normalizeFeatures(input);

    double prevCost = computeCost(input, output, m_theta);
    double crtCost = prevCost;
    for (int iteration = 0; iteration < numIterations; ++iteration)
    {
		if (iterationsBetweenReport)
        	if (iteration % iterationsBetweenReport == 0 || iteration + 1 == numIterations)
            	std::cout << "Iteration: " << iteration << " | Cost: " << crtCost << std::endl;
        if (crtCost > prevCost)
        {
            std::cout << "The cost is increasing. Choose a smaller learning rate." << std::endl;
            return;
        }
        backprop(input, output);
        prevCost = crtCost;
        crtCost = computeCost(input, output, m_theta);
    }
}
Example #2
0
void SegmentList::prepare() {
   foreach (Segment * const segment, *this) {
      segment->relativizePosition();
      segment->calculateSpatialFeatures();
      segment->calculateColorFeatures();
      segment->calculateContour();
   }
   normalizeFeatures();
   calculateFeatureVariances();
}
void CFeatureOperatorAnd::getModifiedState(CStateCollection *stateCol, CState *featState)
{
	int featureOffset = 1;

	std::list<CStateModifier *>::iterator it = getStateModifiers()->begin();
	std::list<CState *>::iterator stateIt = states->begin();


	CState *stateBuf;

	for (unsigned int i = 0; i < getNumDiscreteStates();i ++)
	{
		featState->setDiscreteState(i, 0);
		featState->setContinuousState(i, 1.0);
	}

	int repetitions = getNumDiscreteStates();
	for (int j = 0; it != getStateModifiers()->end(); it ++, stateIt ++, j ++)
	{
		repetitions /= (*it)->getNumDiscreteStates();
		stateBuf = NULL;
		if (stateCol->isMember(*it))
		{
			stateBuf = stateCol->getState(*it);
		}
		else
		{
			stateBuf = *stateIt;
			(*it)->getModifiedState(stateCol, stateBuf);
		}
		
		if (stateBuf->getStateProperties()->isType(FEATURESTATE))
		{
			for (unsigned int i = 0; i < getNumDiscreteStates(); i++)
			{
				unsigned int singleStateFeatureNum = (i / repetitions) % stateBuf->getNumDiscreteStates();
				featState->setDiscreteState(i, featState->getDiscreteState(i) + featureOffset * stateBuf->getDiscreteState(singleStateFeatureNum));
				featState->setContinuousState(i, featState->getContinuousState(i) * stateBuf->getContinuousState(singleStateFeatureNum));
			}
		}
		else
		{
			for (unsigned int i = 0; i < getNumDiscreteStates(); i++)
			{
				featState->setDiscreteState(i, featState->getDiscreteState(i) + featureOffset * stateBuf->getDiscreteState(0));				
			}
		}

		featureOffset = featureOffset * (*it)->getDiscreteStateSize();
	}
	normalizeFeatures(featState);
}
/**
 * Function used to compute the features of the whole image
 * @return the sequence of vectors of features
 */
vector< VectorXd > FeatureExtractor::getFeatures(){
    int cols = im_bw.cols;
    vector< vector <double> > sequenceOfFeatures;
    vector< VectorXd > result;

    for(int j = 0; j < cols; ++j)
    {
        vector<double> winFeatures = computeFeaturesPerWindow(j);
        sequenceOfFeatures.push_back(winFeatures);
        result.push_back(convertToVectorXd(sequenceOfFeatures[j]));
    }

    return normalizeFeatures(result);
}
void CFeatureOperatorOr::getModifiedState(CStateCollection *stateCol, CState *state)
{
	assert(bInit);

	std::list<CStateModifier *>::iterator it = getStateModifiers()->begin();
	std::list<CState *>::iterator stateIt = states->begin();

	CState *stateBuf;

	int i = 0;
	int numFeatures = 0;

	for (; it != getStateModifiers()->end(); it++, stateIt++)
	{
		if (stateCol->isMember(*it))
		{
			stateBuf = stateCol->getState(*it);
		}
		else
		{
			stateBuf = *stateIt;
			(*it)->getModifiedState(stateCol, stateBuf);
		}
		double featureStateFactor = (*this->featureFactors)[*it];
		if (stateBuf->getStateProperties()->isType(FEATURESTATE))
		{
			for (unsigned int j = 0; j < stateBuf->getNumDiscreteStates(); j++)
			{
				state->setDiscreteState(i, stateBuf->getDiscreteState(j) + numFeatures);
				state->setContinuousState(i, stateBuf->getContinuousState(j) * featureStateFactor);
				i ++;
			}
		}
		else
		{
			if (stateBuf->getStateProperties()->isType(DISCRETESTATE))
			{
				state->setDiscreteState(i, stateBuf->getDiscreteState(0) + numFeatures);
				state->setContinuousState(i, featureStateFactor);
				i ++;
			}
		}

		numFeatures += (*it)->getDiscreteStateSize();
	}
	normalizeFeatures(state);
}
svmModel SMO::train()
{
    int passes = 0;
    int maxPasses = 25;
    int numChanged = 0;
    int examineAll = 1;
    alpha.resize(points.size(), 0);
    errorCache.resize(points.size(), 0);
    w.resize(points.size(), 0);
    threshold = 0;
    // Normalize the input points
    normalizeFeatures();
    // SMO outer loop:
    // Every iteration altranates between sweep through all points examineAll = 1 and sweep through non-boundary points examineAll = 0.
    while ((numChanged > 0 || examineAll) && (passes < maxPasses)) {
        numChanged = 0;
        if (examineAll) { 
            for (unsigned int i = 0; i < points.size(); i++)
            {
                if (plugin->isAborted() == true)
                {
                    plugin->progress.report("User Aborted", 0, ABORT, true);
                    return svmModel();
                }
                plugin->progress.report("Training SVM for class " + className, passes*100/maxPasses + (i+1)*100/maxPasses/points.size(), NORMAL);
                numChanged += examineExample (i);
            }
        }
        else { 
            for (unsigned int i = 0; i < points.size(); i++)
                if (alpha[i] != 0 && alpha[i] != C)
                {
                    if (plugin->isAborted() == true)
                    {
                        plugin->progress.report("User Aborted", 0, ABORT, true);
                        return svmModel();
                    }
                    plugin->progress.report("Training SVM for class " + className, passes*100/maxPasses + (i+1)*100/maxPasses/points.size(), NORMAL);
                    numChanged += examineExample (i);
                }
        }
        if (examineAll == 1)
            examineAll = 0;
        else if (numChanged == 0)
            examineAll = 1;
        /*       
        double s = 0.0;
        for (unsigned int i=0; i<points.size(); i++)
        s += alpha[i];
        double t = 0.;
        for (unsigned int i=0; i<points.size(); i++)
        for (unsigned int j=0; j<points.size(); j++)
        t += alpha[i]*alpha[j]*target[i]*target[j]*kernel(points[i],points[j]);
        double objFunc = (s - t/2.0); 
        plugin->progress.report(QString("The value of objective function should increase with each iteration.\n The value of objective function = %1").arg(objFunc).toStdString(), (passes*100)/maxPasses, NORMAL);
        */
        passes++;
    }
    plugin->progress.report("Finished training SVM for class " + className, 100, NORMAL, true);

    // Get the model for this class
    vector<double> m_alpha;
    vector<int> m_target;
    int numberOfsupportVectors = 0;
    vector<point> supportVectors;
    int attributes = points[0].size();
    for (unsigned int i = 0; i < alpha.size() ; i++)
    {
        if (alpha[i] > 0)
        {
            m_alpha.push_back(alpha[i]);
        }
    }
    for (unsigned int i = 0; i < alpha.size(); i++)
    {
        if (alpha[i] > 0)
        {
            numberOfsupportVectors++;
            supportVectors.push_back(points[i]);
            m_target.push_back(target[i]);
        }
    }
    svmModel model = svmModel(className, kernelType, threshold, attributes, w, sigma, numberOfsupportVectors, m_alpha, supportVectors, m_target, mu, stdv);

    // Compute the error rates.
    plugin->progress.report("Computing Error Rates using the model for class " + className, 0, NORMAL, true);
    double trainErrorRate = 0;
    double testErrorRate = 0;
    double crossValidationErrorRate = 0;

    for (unsigned int i = 0; i < points.size(); i++)
    {
        plugin->progress.report("Comuting Error Rates using the model for class " + className, (i+1)*60.0/points.size(), NORMAL, true);

        if (model.predict(points[i]) > 0 != target[i] > 0)
            trainErrorRate++;
    }
    trainErrorRate = trainErrorRate*100/points.size();

    for (unsigned int i = 0; i < testSet.size(); i++)
    {
        plugin->progress.report("Comuting Error Rates using the model for class " + className, 60 + (i+1)*20.0/testSet.size(), NORMAL, true);
        if (model.predict(testSet[i]) > 0 != yTest[i] > 0)
            testErrorRate++;
    }
    testErrorRate = testErrorRate*100/points.size();

    for (unsigned int i = 0; i < crossValidationSet.size(); i++)
    {
        plugin->progress.report("Comuting Error Rates using the model for class " + className, 80 + (i+1)*20/crossValidationSet.size(), NORMAL, true);
        if (model.predict(crossValidationSet[i]) > 0 != yCV[i] > 0)
            crossValidationErrorRate++;
    }
    crossValidationErrorRate = crossValidationErrorRate*100/crossValidationSet.size();

	if (testSet.size() && crossValidationSet.size())
		plugin->progress.report(QString("%1\nTrain error = %2\nCrossValidation error = %3\nTest error = %4\n").arg(className.c_str()).arg(trainErrorRate).arg(crossValidationErrorRate).arg(testErrorRate).toStdString(), 100, WARNING, true);
	else
		plugin->progress.report(QString("%1\nTrain error = %2").arg(className.c_str()).arg(trainErrorRate).toStdString(), 100, WARNING, true);

    return model;
}