📄 neuraldemo.cs
字号:
#region Copyright (c), Some Rights Reserved
/*##########################################################################
*
* NeuralDemo.cs
* -------------------------------------------------------------------------
* By
* Murat FIRAT, June 2007
*
* -------------------------------------------------------------------------
* Description:
* NeuralDemo.cs implements the interface that uses backpropagation classes.
*
* -------------------------------------------------------------------------
* Notes:
* To train the B.P.N. Network there must be a folder [in the same directory
* of the .exe ] named "PATTERNS" which contains one image for each pattern.
* (For example, [for english alfhabet] in "PATTERNS" directory
* there must be images, namely 0.bmp, 1.bmp, 2.bmp ... Z.bmp
*
* Sep. 2007:
* I have removed some of drawing panel's features (scroll bars etc..) to
* make the app more understandable and simplified some other code.
*
* -------------------------------------------------------------------------
###########################################################################*/
#endregion
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections.Specialized;
using System.Configuration;
using System.Threading;
using BPSimplified.Lib;
namespace BPSimplified
{
public partial class NeuralDemo : Form
{
//Neural Network Object With Output Type String
private NeuralNetwork<string> neuralNetwork = null;
//Data Members Required For Neural Network
private Dictionary<string, double[]> TrainingSet = null;
private int av_ImageHeight = 0;
private int av_ImageWidth = 0;
private int NumOfPatterns = 0;
//For Asynchronized Programming Instead of Handling Threads
private delegate bool TrainingCallBack();
private AsyncCallback asyCallBack = null;
private IAsyncResult res = null;
private ManualResetEvent ManualReset = null;
private DateTime DTStart;
public NeuralDemo()
{
InitializeComponent();
CreateNeuralNetwork();
asyCallBack = new AsyncCallback(TraningCompleted);
ManualReset = new ManualResetEvent(false);
}
void neuralNetwork_IterationChanged(object o, NeuralEventArgs args)
{
UpdateError(args.CurrentError);
UpdateIteration(args.CurrentIteration);
if (ManualReset.WaitOne(0, true))
args.Stop = true;
}
private void buttonTrain_Click(object sender, EventArgs e)
{
UpdateState("Began Training Process..\r\n");
SetButtons(false);
ManualReset.Reset();
TrainingCallBack TR = new TrainingCallBack(neuralNetwork.Train);
res = TR.BeginInvoke(asyCallBack, TR);
DTStart = DateTime.Now;
timer1.Start();
}
private void TraningCompleted(IAsyncResult result)
{
if(result.AsyncState is TrainingCallBack)
{
TrainingCallBack TR = (TrainingCallBack)result.AsyncState;
bool isSuccess = TR.EndInvoke(res);
if (isSuccess)
UpdateState("Completed Training Process Successfully\r\n");
else
UpdateState("Training Process is Aborted or Exceed Maximum Iteration\r\n");
SetButtons(true);
timer1.Stop();
}
}
private void buttonRecognize_Click(object sender, EventArgs e)
{
string MatchedHigh = "?", MatchedLow = "?";
double OutputValueHight = 0, OutputValueLow = 0;
neuralNetwork.Recognize(input, ref MatchedHigh, ref OutputValueHight,
ref MatchedLow, ref OutputValueLow);
ShowRecognitionResults(MatchedHigh, MatchedLow, OutputValueHight, OutputValueLow);
}
private void ShowRecognitionResults(string MatchedHigh, string MatchedLow, double OutputValueHight, double OutputValueLow)
{
labelMatchedHigh.Text = "Hight: " + MatchedHigh + " (%" + ((int)100 * OutputValueHight).ToString("##") + ")";
labelMatchedLow.Text = "Low: " + MatchedLow + " (%" + ((int)100 * OutputValueLow).ToString("##") + ")";
}
private void buttonClear_Click(object sender, EventArgs e)
{
drawingPanel1.Clear();
}
private void buttonSaveSettings_Click(object sender, EventArgs e)
{
textBoxState.AppendText("Saving Settings..");
//textBoxInputUnit.Text = ((int)((double)(networkInput + NumOfPatterns) * .5)).ToString();
//textBoxHiddenUnit.Text = ((int)((double)(networkInput + NumOfPatterns) * .3)).ToString();
textBoxOutputUnit.Text = NumOfPatterns.ToString();
buttonRecognize.Enabled = false;
buttonSave.Enabled = false;
textBoxState.AppendText("Done!\r\n");
CreateNeuralNetwork();
}
private void CreateNeuralNetwork()
{
if (TrainingSet == null)
throw new Exception("Unable to Create Neural Network As There is No Data to Train..");
{}
if (comboBoxLayers.SelectedIndex == 1)
{
int InputNum = Int16.Parse(textBoxInputUnit.Text);
}
else if (comboBoxLayers.SelectedIndex == 2)
{
int InputNum = Int16.Parse(textBoxInputUnit.Text);
int HiddenNum = Int16.Parse(textBoxHiddenUnit.Text);
}
neuralNetwork.IterationChanged +=
new NeuralNetwork<string>.IterationChangedCallBack(neuralNetwork_IterationChanged);
neuralNetwork.MaximumError = Double.Parse(textBoxMaxError.Text);
}
private void buttonStop_Click(object sender, EventArgs e)
{
ManualReset.Set();
}
private void timer1_Tick(object sender, EventArgs e)
{
TimeSpan TSElapsed = DateTime.Now.Subtract(DTStart);
UpdateTimer(TSElapsed.Hours.ToString("D2") + ":" +
TSElapsed.Minutes.ToString("D2") + ":" +
TSElapsed.Seconds.ToString("D2"));
}
private void buttonSave_Click(object sender, EventArgs e)
{
SaveFileDialog FD = new SaveFileDialog();
FD.Filter = "Network File(*.net)|*.net";
if (FD.ShowDialog() == DialogResult.OK)
{
neuralNetwork.SaveNetwork(FD.FileName);
}
FD.Dispose();
}
private void buttonLoad_Click(object sender, EventArgs e)
{
OpenFileDialog FD = new OpenFileDialog();
FD.Filter = "Network File(*.net)|*.net";
FD.InitialDirectory = Application.StartupPath;
if (FD.ShowDialog() == DialogResult.OK)
{
neuralNetwork.LoadNetwork(FD.FileName);
}
buttonRecognize.Enabled = true;
buttonSave.Enabled = true;
FD.Dispose();
}
#region Methods To Invoke UI Components If Required
private delegate void UpdateUI(object o);
private void SetButtons(object o)
{
//if invoke is required for a control, sure, it is also required for others
//then, it is not needed to check all controls
if (buttonStop.InvokeRequired)
{
buttonStop.Invoke(new UpdateUI(SetButtons), o);
}
else
{
bool b = (bool)o;
buttonStop.Enabled = !b;
buttonRecognize.Enabled = b;
buttonTrain.Enabled = b;
buttonLoad.Enabled = b;
buttonSave.Enabled = b;
}
}
private void UpdateError(object o)
{
if (labelError.InvokeRequired)
{
labelError.Invoke(new UpdateUI(UpdateError), o);
}
else
{
labelError.Text = "Error: " + ((double)o).ToString(".###");
}
}
private void UpdateIteration(object o)
{
if (labelIteration.InvokeRequired)
{
labelIteration.Invoke(new UpdateUI(UpdateIteration), o);
}
else
{
labelIteration.Text = "Iteration: " + ((int)o).ToString();
}
}
private void UpdateState(object o)
{
if (textBoxState.InvokeRequired)
{
textBoxState.Invoke(new UpdateUI(UpdateState), o);
}
else
{
textBoxState.AppendText((string)o);
}
}
private void UpdateTimer(object o)
{
if (labelTimer.InvokeRequired)
{
labelTimer.Invoke(new UpdateUI(UpdateTimer), o);
}
else
{
labelTimer.Text = (string)o;
}
}
#endregion
#region RadioButton & CheckBox Event Handlers- Not Important
private void radioButton_CheckedChanged(object sender, EventArgs e)
{
if (radioButtonBrowse.Checked)
{
textBoxBrowse.Enabled = true;
buttonBrowse.Enabled = true;
drawingPanel1.Enabled = false;
}
else
{
textBoxBrowse.Enabled = false;
buttonBrowse.Enabled = false;
drawingPanel1.Enabled = true;
}
}
private void comboBoxLayers_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBoxLayers.SelectedIndex == 0)
{
textBoxInputUnit.Enabled = false;
textBoxHiddenUnit.Enabled = false;
}
else if (comboBoxLayers.SelectedIndex == 1)
{
textBoxInputUnit.Enabled = true;
textBoxHiddenUnit.Enabled = false;
}
else if (comboBoxLayers.SelectedIndex == 2)
{
textBoxInputUnit.Enabled = true;
textBoxHiddenUnit.Enabled = true;
}
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -