private static void SVMWrapperTrainingPipeline() { Preferences.Instance.modelLoaded = false; TrainingTesting_SharedVariables.training = new LibSVM_TrainTest(); TrainingTesting_SharedVariables.training.setSvmType(); GuiPreferences.Instance.setLog("NOTE: we shouldnt balance labels count. it should be balanced in the protocol"); GuiPreferences.Instance.setLog("Default Training MultiClass on all data"); TrainingTesting_SharedVariables._trainingProblem = TrainingTesting_SharedVariables._trialProblem; // show some statistics regarding the labels Training_MultiRunProcessing.labelStats(TrainingTesting_SharedVariables._trainingProblem); //train GuiPreferences.Instance.setLog("Training on Data"); TrainingTesting_SharedVariables.training.TrainOnAllData(TrainingTesting_SharedVariables._trainingProblem); GuiPreferences.Instance.setLog("Finished Training."); //test on self should get 100% TrainingTesting_SharedVariables.training.TestOnAllData(TrainingTesting_SharedVariables._trainingProblem); GuiPreferences.Instance.setLog("SVM Model Tested on Training Data, check that you get 100%."); TrainingTesting_SharedVariables.training.saveModel(GuiPreferences.Instance.WorkDirectory + "TrainSet_" + GuiPreferences.Instance.NudClassifyUsingTR.ToString() + "th_vectors_scaledCS_filteredIG.libsvm.model"); GuiPreferences.Instance.setLog("SVM Model saved."); TrainingTesting_SharedVariables.training.loadModel(GuiPreferences.Instance.WorkDirectory + "TrainSet_" + GuiPreferences.Instance.NudClassifyUsingTR.ToString() + "th_vectors_scaledCS_filteredIG.libsvm.model"); GuiPreferences.Instance.setLog("SVM Model loaded."); //test loaded model - DOES IT REALY USE THE LOADED MODEL? THIS IS UNVERIFIED, DONT RELY UNTIL TESTED. TrainingTesting_SharedVariables.training.TestOnAllData(TrainingTesting_SharedVariables._trainingProblem); GuiPreferences.Instance.setLog("SVM Model Tested on data (sanity check for loaded model)."); //display top IG on dicom view if (Preferences.Instance.attsel == null) { GuiPreferences.Instance.setLog("there are no ranked IG attributes or selected attr, continuing but please fix this possible bug."); } GuiPreferences.Instance.setLog("Dicom Viewer Displaying.."); string dicomDir = GuiPreferences.Instance.WorkDirectory; dicomDir = dicomDir.Substring(0, dicomDir.Length - 4) + @"master\"; string[] files = System.IO.Directory.GetFiles(dicomDir, "*.dcm"); string firstFile = files[0].Substring(files[0].LastIndexOf(@"\") + 1); bool thresholdOrVoxelAmount; if (GuiPreferences.Instance.IgSelectionType == IGType.Threshold) { thresholdOrVoxelAmount = true; } else { thresholdOrVoxelAmount = false; } Form plotForm = new DicomImageViewer.MainForm(dicomDir + firstFile, firstFile, Preferences.Instance.attsel.rankedAttributes(), Convert.ToDouble(GuiPreferences.Instance.NudIGThreshold), Convert.ToInt32(GuiPreferences.Instance.NudIGVoxelAmount), thresholdOrVoxelAmount);// _trainTopIGFeatures); plotForm.StartPosition = FormStartPosition.CenterParent; plotForm.ShowDialog(); plotForm.Close(); GuiPreferences.Instance.setLog("Dicom Viewer Closed."); }
/// <summary> /// when train button pushed, we add jobs, pre, process, post them. /// </summary> public static void Train() { GC.Collect(); if (TrainingTesting_SharedVariables._trialProblem != null) { if (TrainingTesting_SharedVariables._trialProblem.samples != null) { //temprarily the weka pipeline is the first thing we want to do, as it doesnt need all the C# wrapper functions and configuration if (GuiPreferences.Instance.TrainType == TrainingType.Weka) { if (GuiPreferences.Instance.CbSVMChecked) { GuiPreferences.Instance.setLog("SVM C# Wrapper Training.."); SVMWrapperTrainingPipeline(); } else if (GuiPreferences.Instance.CbSMOChecked) { GuiPreferences.Instance.setLog("SMO Training.."); WekaTrainingPipeline(TrainingTesting_SharedVariables._trialWekaData); } return; } GuiPreferences.Instance.setLog("TODO: if any models were loaded we ignore then as they would be replaced by training again.\n" + "actually this should only be for rfe/grid/90-10, as cfv doesnt provide a model."); Preferences.Instance.modelLoaded = false; TrainingTesting_SharedVariables.training = new LibSVM_TrainTest(); TrainingTesting_SharedVariables.training.setSvmType(); GuiPreferences.Instance.setLog("NOTE: we shouldnt balance labels count. it should be balanced in the protocol"); //if not multiclass, keep only the two binary classes if (!GuiPreferences.Instance.CbMultiClassChecked) { TrainingTesting_SharedVariables._trainingProblem = Training_MultiRunProcessing.getBinaryClases(TrainingTesting_SharedVariables._trialProblem); GuiPreferences.Instance.setLog("Using only Binary Classes"); } else { TrainingTesting_SharedVariables._trainingProblem = TrainingTesting_SharedVariables._trialProblem; } // show some statistics regarding the labels Training_MultiRunProcessing.labelStats(TrainingTesting_SharedVariables._trainingProblem); if (GuiPreferences.Instance.TrainType == TrainingType.TrainTestSplit) { GuiPreferences.Instance.setLog("Starting Training, splitting folds 90%/10%."); libSVM_ExtendedProblem train_problem = new libSVM_ExtendedProblem(); libSVM_ExtendedProblem test_problem = new libSVM_ExtendedProblem(); int[] test_indices = ChronologicalSplitTrainTest(TrainingTesting_SharedVariables._trainingProblem, ref train_problem, ref test_problem); TrainingTesting_SharedVariables.training.TrainTestSplit(train_problem, test_problem, test_indices); GuiPreferences.Instance.setLog("Finished Training."); } else if (GuiPreferences.Instance.TrainType == TrainingType.CrossValidation) { GuiPreferences.Instance.setLog("Starting Cross Validation, using " + GuiPreferences.Instance.NudCVFolds.ToString() + " folds."); TrainingTesting_SharedVariables.training.TrainFolds((int)GuiPreferences.Instance.NudCVFolds, TrainingTesting_SharedVariables._trainingProblem, LibSVM_TrainTest.trainingType.cfv); GuiPreferences.Instance.setLog("Finished Cross Validation."); } else if (GuiPreferences.Instance.TrainType == TrainingType.GridSearch) { GuiPreferences.Instance.setLog("Starting Grid Search, using " + GuiPreferences.Instance.NudGridFolds.ToString() + " folds."); TrainingTesting_SharedVariables.training.TrainFolds((int)GuiPreferences.Instance.NudGridFolds, TrainingTesting_SharedVariables._trainingProblem, LibSVM_TrainTest.trainingType.bestTotal); GuiPreferences.Instance.setLog("Finished Grid Search."); } else if (GuiPreferences.Instance.TrainType == TrainingType.RFE) { GuiPreferences.Instance.setLog("Not Implemented yet."); } ///copy model into main model variable if (GuiPreferences.Instance.TrainType != TrainingType.CrossValidation) { //training. Preferences.Instance.svmModel = (libSVM)Preferences.Instance.svmWrapper; GuiPreferences.Instance.setLog("Model saved into memory"); } } else { GuiPreferences.Instance.setLog("Training Failed: Original(unprocessed) or Final Problem(processed) Samples empty!"); } } else { GuiPreferences.Instance.setLog("Training Failed: Original(unprocessed) or Final Problem(processed) null!"); } }