|
From: Gustavo P. B. <gb...@us...> - 2005-06-19 02:04:11
|
Update of /cvsroot/kimageprocess/kimageprocess/src/plugins/snns In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7222 Modified Files: snns.cpp snns.h Log Message: - Save all values in memory before writing to the file - Normalize all values to get more sane results Index: snns.cpp =================================================================== RCS file: /cvsroot/kimageprocess/kimageprocess/src/plugins/snns/snns.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- snns.cpp 26 Feb 2005 20:37:42 -0000 1.3 +++ snns.cpp 19 Jun 2005 02:03:55 -0000 1.4 @@ -69,6 +69,9 @@ tmpHeaderFile.setAutoDelete(false); m_tempFile = new KTempFile(); m_tempFile->setAutoDelete(false); + + m_input = imageManager()->activeFeaturesCount(); + m_output = imageManager()->sampleCount(); if (tmpHeaderFile.file()->isOpen() && m_tempFile->file()->isOpen()) { @@ -78,9 +81,9 @@ m_contents += "generated at " + QDateTime::currentDateTime().toString(); m_contents += "\n\n\n"; m_contents += "No. of patterns : %1\n"; - m_contents += "No. of input units : " + QString::number( imageManager()->activeFeaturesCount() ); + m_contents += "No. of input units : " + QString::number( m_input ); m_contents += "\n"; - m_contents += "No. of output units : " + QString::number( imageManager()->sampleCount() ); + m_contents += "No. of output units : " + QString::number( m_output ); m_contents += "\n\n"; QStringList names = imageManager()->activeFeatureNames(); @@ -92,8 +95,51 @@ m_contents += "#" + features + "\n\n"; m_stream.setDevice(m_tempFile->file()); + + m_first = true; + m_patterns.clear(); + m_max.resize(m_input, 0); + m_min.resize(m_input, 0); imageManager()->generatePatternFile(0, this); + QValueList<pattern>::iterator end = m_patterns.end(); + + float dif[m_input]; + for (int i=0; i < m_input; ++i) + dif[i] = m_max[i] - m_min[i]; + + for (QValueList<pattern>::iterator it = m_patterns.begin(); it != end; ++it) + { + QString line = ""; + for ( int i=0; i < m_input; ++i ) + { + line += " " + QString::number((*it).inputs[i]); + (*it).inputs[i] = ((*it).inputs[i] - m_min[i]) * 100 / dif[i]; + } + kdDebug() << line << endl; + } + + for (QValueList<pattern>::iterator it = m_patterns.begin(); it != end; ++it) + { + QString line = ""; + + for ( int i=0; i < m_input; ++i ) + line.sprintf("%s %.5f", line.ascii(), (*it).inputs[i]); + + m_stream << line.stripWhiteSpace() << endl; + + QString temp=""; + for (int j = 1; j <= m_output; j++) + if (j == (*it).sampleClass) + temp += "1 "; + else + temp += "0 "; + + m_stream << temp.stripWhiteSpace() << endl << endl; + m_patternCount++; + + } + //save the pattern file QTextStream streamHeader(tmpHeaderFile.file()); streamHeader << m_contents.arg(m_patternCount); @@ -116,9 +162,12 @@ void KTSNNSPlugin::slotGenerateTestingPattern() { KURL dest = KFileDialog::getSaveURL(QString::null,i18n("*.pat|Pattern files"),0,i18n("Save pattern")); - + if (!dest.isEmpty()) { + m_input = imageManager()->activeFeaturesCount(); + m_output = imageManager()->sampleCount(); + m_sampleImage = dest; m_patternCount = 0; KTempFile tmpHeaderFile; @@ -148,8 +197,44 @@ m_contents += "#" + features + "\n\n"; m_stream.setDevice(m_tempFile->file()); + + m_patterns.clear(); + m_max.resize(m_input, 0); + m_min.resize(m_input, 0); + m_first = true; imageManager()->generateTestPatFile(0, this); + float dif[m_input]; + for (int i=0; i < m_input; ++i) + dif[i] = m_max[i] - m_min[i]; + + QValueList<pattern>::iterator end = m_patterns.end(); + for (QValueList<pattern>::iterator it = m_patterns.begin(); it != end; ++it) + { + QString line = ""; + for ( int i=0; i < m_input; ++i ) + { + line += " " + QString::number((*it).inputs[i]); + (*it).inputs[i] = ((*it).inputs[i] - m_min[i]) * 100 / dif[i]; + } + kdDebug() << line << endl; + } + + for (QValueList<pattern>::iterator it = m_patterns.begin(); it != end; ++it) + { + QString line = ""; + + //append the count (just for debuggin purposes ) + m_stream << "#" << ++m_patternCount << endl; + + for ( int i=0; i < m_input; ++i) + line.sprintf("%s %.5f", line.ascii(), (*it).inputs[i]); + + line = line + "\n"; + m_stream << line.stripWhiteSpace() << endl << endl; + + } + //save the pattern file QTextStream streamHeader(tmpHeaderFile.file()); streamHeader << m_contents.arg(m_patternCount); @@ -175,38 +260,69 @@ void KTSNNSPlugin::parseResults(const QValueList<float> &results) { - QString line = ""; + float *inputs = new float[m_input]; + + QValueList<float>::const_iterator it; + + if (m_first) + { + for (int j = 0; j < m_input; ++j) + m_min[j] = m_max[j] = inputs[j]; + m_first = false; + } - //append the count (just for debuggin purposes - m_stream << "#" << ++m_patternCount << endl; + int i = 0; - QValueList<float>::const_iterator it; - for ( it = results.begin(); it != results.end(); ++it ) - line.sprintf("%s %.5f", line.ascii(), (*it)); + //prepare the input + for ( it = results.begin(); it != results.end(); ++it) + { + inputs[i] = (*it); + if (inputs[i] > m_max[i]) + m_max[i] = inputs[i]; + else if (inputs[i] < m_min[i]) + m_min[i] = inputs[i]; + ++i; +} + + pattern pat; + pat.inputs = inputs; + pat.sampleClass = 0; + m_patterns.append(pat); - line = line + "\n"; - m_stream << line.stripWhiteSpace() << endl << endl; } void KTSNNSPlugin::parseSampleResults(const QValueList<float> &results, int sampleClass) { - QString line = ""; - + float *inputs = new float[m_input]; + QValueList<float>::const_iterator it; - for ( it = results.begin(); it != results.end(); ++it ) - line.sprintf("%s %.5f", line.ascii(), (*it)); - m_stream << line.stripWhiteSpace() << endl; + + if (m_first) + { + for (int j = 0; j < m_input; ++j) + m_min[j] = m_max[j] = inputs[j]; + m_first = false; + } + + int i = 0; - QString temp=""; - for (int j = 1; j <= imageManager()->sampleCount(); j++) - if (j == sampleClass) - temp += "1 "; - else - temp += "0 "; + //prepare the input + for ( it = results.begin(); it != results.end(); ++it) + { + inputs[i] = (*it); + if (inputs[i] > m_max[i]) + m_max[i] = inputs[i]; + else if (inputs[i] < m_min[i]) + m_min[i] = inputs[i]; + ++i; + } + + pattern pat; + pat.inputs = inputs; + pat.sampleClass = sampleClass; + m_patterns.append(pat); - m_stream << temp.stripWhiteSpace() << endl << endl; - m_patternCount++; } Index: snns.h =================================================================== RCS file: /cvsroot/kimageprocess/kimageprocess/src/plugins/snns/snns.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- snns.h 26 Feb 2005 23:35:26 -0000 1.4 +++ snns.h 19 Jun 2005 02:03:56 -0000 1.5 @@ -24,6 +24,7 @@ #include <ktclassifbackend.h> #include <qvaluelist.h> +#include <qvaluevector.h> #include <kurl.h> @@ -31,6 +32,12 @@ class KTImage; class KTempFile; +typedef struct +{ + float *inputs; + int sampleClass; +} pattern; + /** A SNNS backend plugin @author Gustavo Pichorim Boiko @@ -62,6 +69,13 @@ KTempFile *m_tempFile; QTextStream m_stream; + QValueList<pattern> m_patterns; + + int m_input; + int m_output; + QValueVector<float> m_min; + QValueVector<float> m_max; + bool m_first; private slots: void slotGenerateTrainingPattern(); |