📄 batch mode.cs
字号:
using System;
using System.IO;
using XOR_ANN.GUI;
using XOR_ANN.ANN;
namespace XOR_ANN.Batch_Run
{
/// <summary>
/// Summary description for Controller.
/// </summary>
public class BatchMode
{
public void runABatchFile()
{
SingletonGlobalParameters.instance().BATCH_MODE = true;
// Use choose the file
// Let the user choose a LOAD file
System.Windows.Forms.OpenFileDialog fileDialog = new System.Windows.Forms.OpenFileDialog();
fileDialog.Filter = "ANN Assignment Batch files (*.csv)|*.csv";
fileDialog.InitialDirectory = @"C:\temp";
fileDialog.ShowDialog();
string fileName = fileDialog.FileName;
if (File.Exists(fileName))
{
// Pull the data out of the file
BatchDataStructure[] batchData = this.readBatchFile(fileName);
// Make space for the output file
File.Delete("C:\\ANN_Results.csv");
StreamWriter fileWriter = new StreamWriter(@"C:\ANN_Results.csv");
fileWriter.WriteLine("Training Data was " + batchData[0].dataFile);
fileWriter.WriteLine("Test Data was " + batchData[0].testFile);
fileWriter.WriteLine("Maximum Epochs was " + batchData[0].maximumEpochs);
// Write Column Headers
fileWriter.WriteLine("Test No, Learning Rate,Momentum,Hidden Nodes,Error Tolerance,Percentage Convergance, Epochs,Seconds,Converged %, Best Guess %, Converged % on Training Data");
fileWriter.Close();
// Loop for each run
for (int i=0; i<batchData.Length; i++)
{
SingletonGlobalParameters.instance().INPUT_WIDTH = batchData[i].dataWidth;
SingletonGlobalParameters.instance().INPUT_HEIGHT = batchData[i].dataHeight;
SingletonGlobalParameters.instance().LEARNING_RATE = batchData[i].learningRate;
SingletonGlobalParameters.instance().MAXIMUM_EPOCHS = batchData[i].maximumEpochs;
SingletonGlobalParameters.instance().MOMENTUM = batchData[i].momentum;
SingletonGlobalParameters.instance().HIDDEN_NODES = batchData[i].hiddenNodes;
SingletonGlobalParameters.instance().OUTPUT_TOLERANCE = batchData[i].errorTolerance;
SingletonGlobalParameters.instance().CONVERGE_PERCENTAGE = batchData[i].percentForConvergence;
// Make a new Execution engine
MainFormLogic nonGUILogic = new MainFormLogic(); // using a new class ensures old data has gone
// Give it the test data
nonGUILogic.LoadSampleData(batchData[i].dataFile);
// Now train
int epochCount = 0;
int seconds = 0;
nonGUILogic.train(out epochCount, out seconds);
// Test the sample data
float convergedPercentage;
float bestguessPercentage;
float originalDataConvergedPercentage;
float originalDatabestguessPercentage;
// Test with sample data
nonGUILogic.TestWeightsWithADataFile(batchData[i].testFile, out convergedPercentage, out bestguessPercentage);
// Retest with original data
nonGUILogic.TestWeightsWithADataFile(batchData[i].dataFile, out originalDataConvergedPercentage, out originalDatabestguessPercentage);
fileWriter = new StreamWriter(@"C:\ANN_Results.csv",true); // append the file
fileWriter.WriteLine(i + "," + batchData[i].learningRate + "," + batchData[i].momentum + "," +
batchData[i].hiddenNodes + "," + batchData[i].errorTolerance + "," + batchData[i].percentForConvergence + "," +
epochCount + "," + seconds + "," + convergedPercentage + "," + bestguessPercentage + "," + originalDataConvergedPercentage);
// Save the state to "number.pkl"
File.Delete(@"C:\" + i + ".pkl");
nonGUILogic.saveData(@"C:\" + i + ".pkl");
fileWriter.Close();
}
// Execute
// Update outputfile
}
SingletonGlobalParameters.instance().BATCH_MODE = false;
}
private BatchDataStructure[] readBatchFile(string pFileName)
{
BatchDataStructure[] output = new BatchDataStructure[100]; //xyzzy note this is set to 100!!!
StreamReader fileReader = new StreamReader(pFileName);
// Read the header
string sampleDataFile = this.getNextHeaderParameter(fileReader);
string trainDataFile = this.getNextHeaderParameter(fileReader);
int dataWidth = Convert.ToInt32(this.getNextHeaderParameter(fileReader));
int dataHeight = Convert.ToInt32(this.getNextHeaderParameter(fileReader));
int maximumEpochs = Convert.ToInt32(this.getNextHeaderParameter(fileReader));
// Initialise DataStructure
for (int i=0; i<output.Length; i++)
{
output[i] = new BatchDataStructure();
output[i].dataFile = sampleDataFile;
output[i].testFile = trainDataFile;
output[i].dataWidth = dataWidth;
output[i].dataHeight = dataHeight;
output[i].maximumEpochs = maximumEpochs;
}
// Read every data line (each line is one run)
fileReader.ReadLine(); // Ingore the headers
this.readDataLines(fileReader, ref output);
fileReader.Close(); // Close file
return output;
}
private string getNextHeaderParameter(StreamReader pFileReader)
{
string workingString = pFileReader.ReadLine();
workingString = workingString.Substring(workingString.IndexOf(",")+1);
workingString = workingString.Substring(0, workingString.IndexOf(","));
return workingString;
}
private void readDataLines(StreamReader pFileReader, ref BatchDataStructure[] pOutput)
{
int rowsToProcess = -1;
while (1==1)
{
string workingString = pFileReader.ReadLine();
if (workingString == null)
break;
rowsToProcess++;
// Parse the current row
string[] parsedString = workingString.Split(',');
pOutput[rowsToProcess].learningRate = (float)Convert.ToDouble(parsedString[0]);
pOutput[rowsToProcess].momentum = (float)Convert.ToDouble(parsedString[1]);
pOutput[rowsToProcess].hiddenNodes = Convert.ToInt32(parsedString[2]);
pOutput[rowsToProcess].errorTolerance = (float)Convert.ToDouble(parsedString[3]);
pOutput[rowsToProcess].percentForConvergence = (float)Convert.ToDouble(parsedString[4]);
}
// Resize the Array
BatchDataStructure[] pWorking= new BatchDataStructure[rowsToProcess+1];
Array.Copy(pOutput, 0, pWorking, 0, rowsToProcess+1);
pOutput = pWorking;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -