📄 nnmod.cpp
字号:
(CNNMod *)GetDlgItem(IDC_STEP)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_INPUT_LAYER_NUMBER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_HIDE_LAYER_NUMBER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_OUTPUT_LAYER_NUMBER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_COMBO_ARITHMETIC)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_COMBO_FUNC)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT_BROWSER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_NETWORK)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_NETWORK_BROWSER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT_BROWSER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_STOP_TRAIN)->EnableWindow(TRUE);
}
}
void CNNMod::OnStopTrain()
{
// TODO: Add your control notification handler code here
DWORD dwExitCode = 0;
::GetExitCodeThread (m_hThread, &dwExitCode);
if(dwExitCode == STILL_ACTIVE)
{
::TerminateThread (m_hThread, (DWORD)0);
CloseHandle (m_hThread);
m_hThread = NULL;
HWND hWnd = ::GetDlgItem (this->m_hWnd, IDC_SYSTEM_ERROR);
::SetWindowText (hWnd, _T("0"));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_TRAIN_TIMES);
::SetWindowText (hWnd, _T("0"));
}
//zdh
(CNNMod *)GetDlgItem(IDC_SYSTEM_LEVEL)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_MAX_TRAIN_TIMES)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_STEP)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_INPUT_LAYER_NUMBER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_HIDE_LAYER_NUMBER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_OUTPUT_LAYER_NUMBER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_COMBO_ARITHMETIC)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_COMBO_FUNC)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT_BROWSER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_NETWORK)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_NETWORK_BROWSER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT_BROWSER)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_STOP_TRAIN)->EnableWindow(TRUE);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);//使得状态这个按钮可操作
//zdh
}
void CNNMod::ForwardCalculateInit()
{
LMForwardCalculateInit( m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
m_matrixDemoDataInput,
m_matrixInputLayerValue,
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerValveValue
);
}
bool CNNMod::DemoDataTrainRepeat()
{
bool bReturn = false;
switch( m_nComboArithmetic)
{
case 0: // LM Arithmetic Selected
bReturn = LMDemoDataTrainRepeat ( m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
m_bSimulateDataFlag,
m_nComboFunc,
m_SystemErrorOld,
m_SystemErrorNew,
m_nSystemErrorLevel,
m_nSystemError,
m_nStep,
m_nMaxTrainTimes,
m_nTrainTimes,
IDC_SYSTEM_ERROR,
IDC_TRAIN_TIMES,
this->m_hWnd,
m_matrixDemoDataInput,
m_matrixInputLayerValue,
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideLayerOutput,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerOutput,
m_matrixOutputLayerValveValue
);
break;
case 1: // BP Arithmetic Selected
bReturn = BPDemoDataTrainRepeat ( m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
m_bSimulateDataFlag,
m_nComboFunc,
m_SystemErrorOld,
m_SystemErrorNew,
m_nSystemErrorLevel,
m_nSystemError,
m_nStep,
m_nMaxTrainTimes,
m_nTrainTimes,
IDC_SYSTEM_ERROR,
IDC_TRAIN_TIMES,
this->m_hWnd,
m_matrixDemoDataInput,
m_matrixInputLayerValue,
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideLayerOutput,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerOutput,
m_matrixOutputLayerValveValue
);
break;
default: // No Arithmetic Selected
return bReturn;
}
return bReturn;
}
bool CNNMod::SaveConstantStringToFile(CString& strFileName,CString& strConstantData)
{
// Convert CString to LPCTSTR
LPCTSTR lpszFileName = "";
strFileName.TrimLeft ();
strFileName.TrimRight ();
lpszFileName = (LPCTSTR)strFileName;
CStdioFile dataFile;
if(!dataFile.Open (lpszFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText))
{
::MessageBox(this->m_hWnd, _T("不能创建存储网络参数的文件!"), _T("错误!"), MB_OK | MB_ICONERROR);
dataFile.Close ();
return FALSE;
}
dataFile.SeekToEnd ();
// Write data into the file
char *pBuffer = new char[strConstantData.GetLength ()];
memcpy(pBuffer,strConstantData,strConstantData.GetLength ());
dataFile.Write (pBuffer,strConstantData.GetLength ());
dataFile.Close ();
return TRUE;
}
bool CNNMod::SimulateData()
{
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(FALSE);
if(!m_bSimulateDataFlag)
{
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_strSimuNetworkFold.IsEmpty ())
{
::MessageBox (this->m_hWnd, _T("你还没选取提供网络参数的文件的装载路径!"), _T(":("),MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_strSimuDataInput.IsEmpty ())
{
::MessageBox (this->m_hWnd, _T("你还没选取用来仿真的数据文件的装载路径!"), _T(":("),MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_strSimuResult.IsEmpty ())
{
::MessageBox (this->m_hWnd, _T("你还没选取最终仿真结果的数据文件的存放路径!"), _T(":("),MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
// 装载网络参数文件
m_matrixSimuNetwork.LoadDataFromFileSpecial(m_strSimuNetworkFold,//路径
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerValveValue,
m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
m_nComboArithmetic,
m_nComboFunc);
// 装载仿真数据文件
m_matrixDemoDataInput.LoadDataFromFile (m_strSimuDataInput);
if( m_matrixDemoDataInput.GetMatrixColNumber () != m_nInputLayerNumber )
{
::MessageBox (this->m_hWnd, _T("待仿真数据文件的输入层数目与网络中的输入层数目不相等!!!"), _T("错误!"), MB_OK | MB_ICONERROR);
// 释放全局变量所占的内存
m_matrixSimuNetwork.InitializeZero ();
m_matrixInputToHideWeightValue.InitializeZero ();
m_matrixHideLayerValveValue.InitializeZero ();
m_matrixHideToOutputWeightValue.InitializeZero ();
m_matrixOutputLayerValveValue.InitializeZero ();
m_matrixDemoDataInput.InitializeZero ();
m_strSimuNetworkFold = TEXT("");
m_strSimuDataInput = TEXT("");
m_strSimuResult = TEXT("");
m_nInputLayerNumber = 0;
m_nHideLayerNumber = 0;
m_nOutputLayerNumber = 0;
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
//*******************************************************************
// Update the UI
//
HWND hWnd = ::GetDlgItem (this->m_hWnd, IDC_SIMU_NETWORK_FOLD);
::SetWindowText (hWnd, _T(""));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_SIMU_DATA_INPUT);
::SetWindowText (hWnd, _T(""));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_SIMU_RESULT);
::SetWindowText (hWnd, _T(""));
return false;
}
else // Successful!!!
{
// 前向计算
switch(m_nComboArithmetic)
{
case 0: // LM Arithmetic Selected
LMForwardCalculate( m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
m_bSimulateDataFlag,
m_nComboFunc,
m_matrixDemoDataInput,
m_matrixInputLayerValue,
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideLayerOutput,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerOutput,
m_matrixOutputLayerValveValue
);
break;
case 1: // BP Arithmetic Selected
BPForwardCalculate2(m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
m_bSimulateDataFlag,
m_nComboFunc,
m_matrixDemoDataInput,
m_matrixInputLayerValue,
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideLayerOutput,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerOutput,
m_matrixOutputLayerValveValue
);
break;
default: // No Arithmetic Selected
return false;
}
// 存储模拟结果
(m_matrixOutputLayerOutput.Transpose()).SaveDataToFile(m_strSimuResult);
// 释放全局变量所占的内存
m_matrixSimuNetwork.InitializeZero ();
m_matrixInputToHideWeightValue.InitializeZero ();
m_matrixHideLayerValveValue.InitializeZero ();
m_matrixHideToOutputWeightValue.InitializeZero ();
m_matrixOutputLayerValveValue.InitializeZero ();
m_matrixDemoDataInput.InitializeZero ();
m_matrixHideLayerOutput.InitializeZero ();
m_matrixOutputLayerOutput.InitializeZero ();
m_strSimuNetworkFold = _T("");
m_strSimuDataInput = _T("");
m_strSimuResult = _T("");
m_nComboFunc = -1;
m_nInputLayerNumber = 0;
m_nHideLayerNumber = 0;
m_nOutputLayerNumber = 0;
::MessageBox (this->m_hWnd, _T("数据仿真结果保存成功!"), _T("恭喜!"), MB_OK);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
//*******************************************************************
// Update the UI
//
HWND hWnd = ::GetDlgItem (this->m_hWnd, IDC_SIMU_NETWORK_FOLD);
::SetWindowText (hWnd, _T(""));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_SIMU_DATA_INPUT);
::SetWindowText (hWnd, _T(""));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_SIMU_RESULT);
::SetWindowText (hWnd, _T(""));
}
return true;
}
bool CNNMod::TrainingDemo()//bool CNNMod::Trainingzdh()
{
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(FALSE);
if(m_bSimulateDataFlag)
{
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_nInputLayerNumber <= 0)
{
::MessageBox (this->m_hWnd, _T("输入层数目必须为大于等于1的正整数!"), _T(":("), MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_nHideLayerNumber <= 0)
{
::MessageBox (this->m_hWnd, _T("隐含层数目必须为大于等于1的正整数!"), _T(":("),MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_nOutputLayerNumber <= 0)
{
::MessageBox (this->m_hWnd, _T("输出层数目必须为大于等于1的正整数!"), _T(":("), MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_nComboArithmetic == -1)
{
::MessageBox (this->m_hWnd, _T("你还没有选取用来训练的算法!"), _T(":("), MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_nComboFunc == -1)
{
::MessageBox (this->m_hWnd, _T("你还没有选取用来训练的激活函数!"), _T(":("), MB_OK | MB_ICONWARNING);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -