📄 nnmod.cpp
字号:
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_strDemoDataInput.IsEmpty ())
{
::MessageBox (this->m_hWnd, _T("你还没选取用来训练的样本数据文件的装载路径!"), _T(":("), MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_strDemoSaveNetwork.IsEmpty ())
{
::MessageBox (this->m_hWnd, _T("你还没选取最终模拟输出网络参数的文件的存放路径!"), _T(":("), MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
if(m_strDemoSaveResult.IsEmpty ())
{
::MessageBox (this->m_hWnd, _T("你还没选取最终模拟输出结果的文件的存放路径!"), _T(":("), MB_OK | MB_ICONWARNING);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return false;
}
// 装载资源
m_matrixDemoDataInput.LoadDataFromFile (m_strDemoDataInput);
if((m_nInputLayerNumber + m_nOutputLayerNumber) != m_matrixDemoDataInput.GetMatrixColNumber () )
{
::MessageBox (this->m_hWnd, _T("所输入的输入层和输出层数目之和与被读取文件中的数目不相符!"), _T("错误!"), MB_OK | MB_ICONERROR);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
return FALSE;
}
//zdh***使在训练时不能重新更改,本来更改也无效,因为数据已经读入了
(CNNMod *)GetDlgItem(IDC_SYSTEM_LEVEL)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_MAX_TRAIN_TIMES)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_STEP)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_INPUT_LAYER_NUMBER)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_HIDE_LAYER_NUMBER)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_OUTPUT_LAYER_NUMBER)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_COMBO_ARITHMETIC)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_COMBO_FUNC)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT_BROWSER)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_NETWORK)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_NETWORK_BROWSER)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT)->EnableWindow(FALSE);
(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT_BROWSER)->EnableWindow(FALSE);
//zdh****
// 第一次前向计算初始化
ForwardCalculateInit();
// 反复反馈运算
bool bSuccess = DemoDataTrainRepeat();
if(bSuccess) // Successful!
{
//////////////////////////////////////////////////////////////////////////////
// 定义存储矩阵格式 //
//////////////////////////////////////////////////////////////////////////////
if(!(m_strDemoSaveNetwork.IsEmpty ()))
{
CString strDemoInputLayerNumber = _T("## 样本的输入层的数目: ##\n");
SaveConstantStringToFile(m_strDemoSaveNetwork, strDemoInputLayerNumber);
CString strInputLayerNumber;
strInputLayerNumber.Format ("%u", m_nInputLayerNumber);
SaveConstantStringToFile(m_strDemoSaveNetwork, strInputLayerNumber);
CString strDemoHideLayerNumber = _T("\n## 样本的隐含层的数目: ##\n");
SaveConstantStringToFile(m_strDemoSaveNetwork, strDemoHideLayerNumber);
CString strHideLayerNumber;
strHideLayerNumber.Format ("%u", m_nHideLayerNumber);
SaveConstantStringToFile(m_strDemoSaveNetwork, strHideLayerNumber);
CString strDemoOutputLayerNumber = _T("\n## 样本的输出层的数目: ##\n");
SaveConstantStringToFile(m_strDemoSaveNetwork, strDemoOutputLayerNumber);
CString strOutputLayerNumber;
strOutputLayerNumber.Format ("%u", m_nOutputLayerNumber);
SaveConstantStringToFile(m_strDemoSaveNetwork, strOutputLayerNumber);
CString strSelectAlgorithm = _T("\n## 训练网络所采用的神经网络算法: ##\n");
SaveConstantStringToFile(m_strDemoSaveNetwork, strSelectAlgorithm);
CString strComboArithmetic;
strComboArithmetic.Format ("%d", m_nComboArithmetic);
SaveConstantStringToFile(m_strDemoSaveNetwork, strComboArithmetic);
CString strSelectFunction = _T("\n## 网络中使用的函数的索引值: ##\n");
SaveConstantStringToFile(m_strDemoSaveNetwork, strSelectFunction);
CString strComboFunc;
strComboFunc.Format ("%d", m_nComboFunc);
SaveConstantStringToFile(m_strDemoSaveNetwork, strComboFunc);
CString strSeparator = _T("\n## 输入层到隐含层的权值矩阵 ##\n");
SaveConstantStringToFile(m_strDemoSaveNetwork, strSeparator);
// 存储模拟过的输入到隐含层的权值矩阵
m_matrixInputToHideWeightValue.SaveDataToFile (m_strDemoSaveNetwork);
strSeparator = _T("\n## 隐含层的阀值矩阵 ##\n");
SaveConstantStringToFile(m_strDemoSaveNetwork,strSeparator);
// 存储模拟过的隐含层的阀值矩阵
m_matrixHideLayerValveValue.SaveDataToFile (m_strDemoSaveNetwork);
strSeparator = _T("\n## 隐含层到输出层的权值矩阵 ##\n");
SaveConstantStringToFile(m_strDemoSaveNetwork,strSeparator);
// 存储模拟过的隐含层到输出层的权值矩阵
m_matrixHideToOutputWeightValue.SaveDataToFile (m_strDemoSaveNetwork);
strSeparator = _T("\n## 输出层的阀值矩阵 ##\n");
SaveConstantStringToFile(m_strDemoSaveNetwork,strSeparator);
// 存储模拟过的输出层的阀值矩阵
m_matrixOutputLayerValveValue.SaveDataToFile (m_strDemoSaveNetwork);
}
// 存储模拟过的输出层的输出值矩阵
if(!(m_strDemoSaveResult.IsEmpty ()))
{
(m_matrixOutputLayerOutput.Transpose()).SaveDataToFile (m_strDemoSaveResult);
}
// 释放全局变量所占的内存
m_matrixDemoDataInput.InitializeZero ();
m_matrixInputLayerValue.InitializeZero ();
m_matrixInputToHideWeightValue.InitializeZero ();
m_matrixHideLayerValveValue.InitializeZero ();
m_matrixHideLayerOutput.InitializeZero ();
m_matrixHideToOutputWeightValue.InitializeZero ();
m_matrixOutputLayerValveValue.InitializeZero ();
m_matrixOutputLayerOutput.InitializeZero ();
// ReInitialize the global value
m_nInputLayerNumber = 0;
m_nHideLayerNumber = 0;
m_nOutputLayerNumber = 0;
m_nComboFunc = -1;
m_nComboArithmetic = -1;
m_nSystemError = 0;
m_nTrainTimes = 0;
m_nSystemErrorLevel = SYSTEM_ERROR_LEVEL;
m_nMaxTrainTimes = LOOP_MAX_TIMES;
m_SystemErrorNew = MAX_SYSTEM_ERROR;
m_SystemErrorOld = MAX_SYSTEM_ERROR;
m_nStep = INIT_STEP;
m_strDemoDataInput = TEXT("");
m_strDemoSaveNetwork = TEXT("");
m_strDemoSaveResult = TEXT("");
::MessageBox (this->m_hWnd, _T("训练次数到了/模型精度已经满足!"), _T("恭喜!"), MB_OK);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
//*******************************************************************
// handle the UI
//
CString strSystemErrorLevel;
strSystemErrorLevel.Format ("%lf", m_nSystemErrorLevel);
HWND hWnd = ::GetDlgItem (this->m_hWnd, IDC_SYSTEM_LEVEL);
::SetWindowText (hWnd, (LPCTSTR)strSystemErrorLevel);
CString strMaxTrainTimes;
strMaxTrainTimes.Format ("%u", m_nMaxTrainTimes);
hWnd = ::GetDlgItem (this->m_hWnd, IDC_MAX_TRAIN_TIMES);
::SetWindowText (hWnd, (LPCTSTR)strMaxTrainTimes);
hWnd = ::GetDlgItem (this->m_hWnd, IDC_INPUT_LAYER_NUMBER);
::SetWindowText (hWnd, _T("0"));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_HIDE_LAYER_NUMBER);
::SetWindowText (hWnd, _T("0"));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_OUTPUT_LAYER_NUMBER);
::SetWindowText (hWnd, _T("0"));
m_ctrlComboArithmetic.SetCurSel (-1);
m_ctrlComboFunc.SetCurSel (-1);
hWnd = ::GetDlgItem (this->m_hWnd, IDC_DEMO_DATA_INPUT);
::SetWindowText (hWnd, _T(""));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_DEMO_SAVE_NETWORK);
::SetWindowText (hWnd, _T(""));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_DEMO_SAVE_RESULT);
::SetWindowText (hWnd, _T(""));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_SYSTEM_ERROR);
::SetWindowText (hWnd, _T("0"));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_TRAIN_TIMES);
::SetWindowText (hWnd, _T("0"));
}
else // Fail to accomplish the task
{
// 释放全局变量所占的内存
m_matrixDemoDataInput.InitializeZero ();
m_matrixInputLayerValue.InitializeZero ();
m_matrixInputToHideWeightValue.InitializeZero ();
m_matrixHideLayerValveValue.InitializeZero ();
m_matrixHideLayerOutput.InitializeZero ();
m_matrixHideToOutputWeightValue.InitializeZero ();
m_matrixOutputLayerValveValue.InitializeZero ();
m_matrixOutputLayerOutput.InitializeZero ();
// ReInitialize the global value
m_nInputLayerNumber = 0;
m_nHideLayerNumber = 0;
m_nOutputLayerNumber = 0;
m_nComboFunc = -1;
m_nComboArithmetic = -1;
m_nSystemError = 0;
m_nTrainTimes = 0;
m_nSystemErrorLevel = SYSTEM_ERROR_LEVEL;
m_nMaxTrainTimes = LOOP_MAX_TIMES;
m_SystemErrorNew = MAX_SYSTEM_ERROR;
m_SystemErrorOld = MAX_SYSTEM_ERROR;
m_nStep = INIT_STEP;
m_strDemoDataInput = TEXT("");
m_strDemoSaveNetwork = TEXT("");
m_strDemoSaveResult = TEXT("");
::MessageBox (this->m_hWnd, _T("未能完成您交给我的任务,请重新设置各参数后,再试!"), _T("抱歉!"),MB_OK | MB_ICONERROR);
(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
//*******************************************************************
// handle the UI
//
CString strSystemErrorLevel;
strSystemErrorLevel.Format ("%lf", m_nSystemErrorLevel);
HWND hWnd = ::GetDlgItem (this->m_hWnd, IDC_SYSTEM_LEVEL);
::SetWindowText (hWnd, (LPCTSTR)strSystemErrorLevel);
CString strMaxTrainTimes;
strMaxTrainTimes.Format ("%u", m_nMaxTrainTimes);
hWnd = ::GetDlgItem (this->m_hWnd, IDC_MAX_TRAIN_TIMES);
::SetWindowText (hWnd, (LPCTSTR)strMaxTrainTimes);
hWnd = ::GetDlgItem (this->m_hWnd, IDC_INPUT_LAYER_NUMBER);
::SetWindowText (hWnd, _T("0"));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_HIDE_LAYER_NUMBER);
::SetWindowText (hWnd, _T("0"));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_OUTPUT_LAYER_NUMBER);
::SetWindowText (hWnd, _T("0"));
m_ctrlComboArithmetic.SetCurSel (-1);
m_ctrlComboFunc.SetCurSel (-1);
hWnd = ::GetDlgItem (this->m_hWnd, IDC_DEMO_DATA_INPUT);
::SetWindowText (hWnd, _T(""));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_DEMO_SAVE_NETWORK);
::SetWindowText (hWnd, _T(""));
hWnd = ::GetDlgItem (this->m_hWnd, IDC_DEMO_SAVE_RESULT);
::SetWindowText (hWnd, _T(""));
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);
//zdh
return false;
}
//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);
//zdh
return true;
}
void CNNMod::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CFormView::OnTimer(nIDEvent);
}
/////////////////////////////////////////////////////////////////////////////
// 工作线程过程
//
/////////////////////////////////////////////////////////////////////////////
ULONG __stdcall WorkThreadProc(LPVOID lParam)
{
if(lParam == NULL)
return -1;
STHREADDATA *pData = (STHREADDATA *)lParam;
// Set the flag
pData->pDlg->m_bStartFlag = true;
if(pData->pDlg->m_bSimulateDataFlag)
{
pData->pDlg->SimulateData();
}
else
{
pData->pDlg->TrainingDemo();//通过工作线程来含接训练程序
}
pData->pDlg->m_bStartFlag = false;
delete pData;
pData = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -