/// <summary> /// Huấn luyện mô hình ANN - DT /// </summary> private void TrainANN_DT(bool isBatchMode) { string strTrainFile = null; if (isBatchMode) { strTrainFile = _trainFilePath; } else { strTrainFile = tbxTrainFilePath.Text; } // Xác định bộ tham số DT với dữ liệu train tỉ lệ 9:1 SetBestParamater4DT_ANN(strTrainFile); // Bước 1: Xây dựng mô hình DT với dữ liệu train int iPos = strTrainFile.LastIndexOf('.'); string dataFile = strTrainFile.Remove(iPos) + ".data.txt"; iPos = strTrainFile.IndexOf('_'); string metaFile = strTrainFile.Remove(iPos) + ".meta"; // Tạo dữ liệu Train Dataset dataDTTrain = new Dataset(metaFile, dataFile); DecisionTreeAlgorithm tree = new DecisionTreeAlgorithm(dataDTTrain); switch (cmbSplitFunc.SelectedItem.ToString()) { case "Gain": tree.SplitFun = DecisionTreeAlgorithm.SPLIT_GAIN; break; case "Gain Ratio": tree.SplitFun = DecisionTreeAlgorithm.SPLIT_GAIN_RATIO; break; case "GINI": tree.SplitFun = DecisionTreeAlgorithm.SPLIT_GINI; break; case "Random": tree.SplitFun = DecisionTreeAlgorithm.SPLIT_RANDOM; break; } switch (cmbPruneFunc.SelectedItem.ToString()) { case "Pessimistic": tree.PruneAlg = DecisionTreeAlgorithm.PRUNING_PESSIMISTIC; break; case "Reduced-error": tree.PruneAlg = DecisionTreeAlgorithm.PRUNING_REDUCED_ERROR; break; } // Học, xây dựng lên cây quyết định tree.BuildDTTree(); // Duyệt cây và trích ra tập luật tree.ExtractRules(); iPos = strTrainFile.LastIndexOf('_'); string ruleFile = strTrainFile.Remove(iPos) + ".rules"; tree.SaveRule2File(ruleFile); // Bước 2: Thực hiện test trên dữ liệu train với mô hình mới tạo // và xác định số mẫu test dúng làm đầu vào cho AN gợi là NewDataTrain // Thực hiện test lại với dữ liệu train, những mẫu test phân lớp lại đúng // Sẽ là dữ liệu train cho ANN đặt là newANNDataTrain Dataset dataDTTest = dataDTTrain; List<int> CorrectClassifyTests = tree.ListRules.ClassifyAgain(dataDTTest); // Bước 3: Thực hiện xây dựng mô hình ANN với dữ liệu học moi // Thực hiện test lại với dữ liệu train //khởi tạo các tham số cho mạng ANNParameterBUS.HiddenNode = int.Parse(tbxANNHiddenNode.Text); ANNParameterBUS.OutputNode = 3; ANNParameterBUS.MaxEpoch = int.Parse(tbxMaxLoops.Text); ANNParameterBUS.LearningRate = double.Parse(tbxLearningRate.Text); ANNParameterBUS.Momentum = double.Parse(tbxMomentum.Text); ANNParameterBUS.Bias = double.Parse(tbxBias.Text); //Tiến hành train BackpropagationNetwork bpNetwork; TrainingSet tempTrainingSet = new TrainingSet(strTrainFile, ANNParameterBUS.OutputNode); TrainingSet trainSet = new TrainingSet(tempTrainingSet.InputVectorLength, ANNParameterBUS.OutputNode); for (int i = 0; i < CorrectClassifyTests.Count; i++) { int pos = (int)CorrectClassifyTests[i]; TrainingSample tsp = (TrainingSample)tempTrainingSet[pos]; trainSet.Add(tsp); } LinearLayer inputLayer = new LinearLayer(trainSet.InputVectorLength); ActivationLayer hidenLayer = null; ActivationLayer outputLayer = null; switch (cmbActivationFunc.SelectedItem.ToString()) { case "Sigmoid": hidenLayer = new SigmoidLayer(ANNParameterBUS.HiddenNode); outputLayer = new SigmoidLayer(ANNParameterBUS.OutputNode); break; case "Tanh": hidenLayer = new TanhLayer(ANNParameterBUS.HiddenNode); outputLayer = new TanhLayer(ANNParameterBUS.OutputNode); break; case "Logarithm": hidenLayer = new LogarithmLayer(ANNParameterBUS.HiddenNode); outputLayer = new LogarithmLayer(ANNParameterBUS.OutputNode); break; case "Sine": hidenLayer = new SineLayer(ANNParameterBUS.HiddenNode); outputLayer = new SineLayer(ANNParameterBUS.OutputNode); break; } new BackpropagationConnector(inputLayer, hidenLayer); new BackpropagationConnector(hidenLayer, outputLayer); bpNetwork = new BackpropagationNetwork(inputLayer, outputLayer); bpNetwork.SetLearningRate(ANNParameterBUS.LearningRate); bpNetwork.EndEpochEvent += new TrainingEpochEventHandler( delegate(object senderNetwork, TrainingEpochEventArgs args) { tlsProgressBar.Value = (int)(args.TrainingIteration * 100d / ANNParameterBUS.MaxEpoch); Application.DoEvents(); }); bpNetwork.Learn(trainSet, ANNParameterBUS.MaxEpoch); // Bước 4: Lưu lại mô hình ANN iPos = strTrainFile.LastIndexOf('_'); string strModelFile = strTrainFile.Remove(iPos + 1) + "model.txt"; Stream stream = File.Open(strModelFile, FileMode.Create); BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, bpNetwork); stream.Close(); tlsProgressBar.Value = 0; }
/// <summary> /// Phần train cho ANN /// </summary> private void TrainANN(bool isBatchMode) { string strTrainFile = null; if (isBatchMode) { strTrainFile = _trainFilePath; } else { strTrainFile = tbxTrainFilePath.Text; } int iPos = strTrainFile.LastIndexOf('_'); string strModelFile = strTrainFile.Remove(iPos + 1) + "model.txt"; //khởi tạo các tham số cho mạng ANNParameterBUS.HiddenNode = int.Parse(tbxANNHiddenNode.Text); ANNParameterBUS.OutputNode = 3; ANNParameterBUS.MaxEpoch = int.Parse(tbxMaxLoops.Text); ANNParameterBUS.LearningRate = double.Parse(tbxLearningRate.Text); ANNParameterBUS.Momentum = double.Parse(tbxMomentum.Text); ANNParameterBUS.Bias = double.Parse(tbxBias.Text); //Tiến hành train BackpropagationNetwork bpNetwork; TrainingSet trainSet = new TrainingSet(strTrainFile, ANNParameterBUS.OutputNode); LinearLayer inputLayer = new LinearLayer(trainSet.InputVectorLength); ActivationLayer hidenLayer = null; ActivationLayer outputLayer = null; switch (cmbActivationFunc.SelectedItem.ToString()) { case "Sigmoid": hidenLayer = new SigmoidLayer(ANNParameterBUS.HiddenNode); outputLayer = new SigmoidLayer(ANNParameterBUS.OutputNode); break; case "Tanh": hidenLayer = new TanhLayer(ANNParameterBUS.HiddenNode); outputLayer = new TanhLayer(ANNParameterBUS.OutputNode); break; case "Logarithm": hidenLayer = new LogarithmLayer(ANNParameterBUS.HiddenNode); outputLayer = new LogarithmLayer(ANNParameterBUS.OutputNode); break; case "Sine": hidenLayer = new SineLayer(ANNParameterBUS.HiddenNode); outputLayer = new SineLayer(ANNParameterBUS.OutputNode); break; } new BackpropagationConnector(inputLayer, hidenLayer); new BackpropagationConnector(hidenLayer, outputLayer); bpNetwork = new BackpropagationNetwork(inputLayer, outputLayer); bpNetwork.SetLearningRate(ANNParameterBUS.LearningRate); bpNetwork.EndEpochEvent += new TrainingEpochEventHandler( delegate(object senderNetwork, TrainingEpochEventArgs args) { tlsProgressBar.Value = (int)(args.TrainingIteration * 100d / ANNParameterBUS.MaxEpoch); tlsStatus.Text = "Current iteration: " + args.TrainingIteration; Application.DoEvents(); }); bpNetwork.Learn(trainSet, ANNParameterBUS.MaxEpoch); // Lưu lại model Stream stream = File.Open(strModelFile, FileMode.Create); BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, bpNetwork); stream.Close(); tlsProgressBar.Value = 0; }