📄 neural_network.cpp
字号:
h_n_num = h_layers[0].GetNode_Num();
o_n_num = o_layers[0].GetNode_Num();
i_n_num = i_layers[0].GetNode_Num();
h_ln_num = h_layers[GetNum_h()-1].GetNode_Num();
for(j=0;j<GetNum_h();j++)
{
h_an_num = h_an_num + h_layers[j].GetNode_Num();
}
ih_w_num = i_layers[0].GetNode_Num()*h_layers[0].GetNode_Num();
for(int ii_h=0;ii_h<GetNum_h()-1;ii_h++)
{
hh_w_num = hh_w_num+h_layers[ii_h].GetNode_Num()*h_layers[ii_h+1].GetNode_Num();
}
float w_sum = 0; //w_sum存储节点加权和
float *temp;
temp = p_data; //保存指针位置
/*算法开始*/
while(!isStop)
{
for(t=0;t<num_data;t++) //周期开始
{
m_w_id = 0; //权重主标识清零
for(i=0;i<i_n_num;i++)
{
i_layers[0].GetNode(i).SetI_value(*p_data); //设置元组输入层单元的输入值
p_data++;
}
for(i=0;i<o_n_num;i++)
{
o_layers[0].GetNode(i).SetT(*p_data); //设置元组输出层单元对应期望
p_data++;
}
/*向前传播输入*/
for(i=0;i<h_n_num;i++)
{
for(j=0;j<i_n_num;j++)
{
k = j*h_n_num;
w_sum = w_sum+(wp[k+i].GetW_w())*(i_layers[0].GetNode(j).GetI_value());
}
i_value = w_sum+h_layers[0].GetNode(i).GetBias(); //计算出隐藏层第一层各个节点的净输入
o_value = 1/(1+exp(-i_value)); //计算出隐藏层第一层各个节点的净输出
h_layers[0].GetNode(i).SetI_value(i_value);
h_layers[0].GetNode(i).SetO_value(o_value);
w_sum = 0;
}
/////////////////////////////////////////////////////
n = h_n_num*i_n_num;
for(i=0;i<GetNum_h()-1;i++)
{
for(j=0;j<h_layers[i+1].GetNode_Num();j++)
{
for(k=0;k<h_layers[i].GetNode_Num();k++)
{
m = k*h_layers[i+1].GetNode_Num();
w_sum = w_sum + (wp[m+j+n].GetW_w())*(h_layers[i].GetNode(k).GetO_value());
}
i_value = w_sum+h_layers[i+1].GetNode(j).GetBias(); //隐藏层其它层净输入
o_value = 1/(1+exp(-i_value)); //隐藏层其它层净输出
h_layers[i+1].GetNode(j).SetI_value(i_value);
h_layers[i+1].GetNode(j).SetO_value(o_value);
w_sum = 0;
}
n = n + h_layers[i].GetNode_Num()*h_layers[i+1].GetNode_Num();
}
/////////////////////////////////////////////////////
for(i=0;i<o_n_num;i++)
{
for(j=0;j<h_ln_num;j++)
{
k = j*o_n_num;
w_sum = w_sum+(wp[(k+i)+(ih_w_num+hh_w_num)].GetW_w())*(h_layers[GetNum_h()-1].GetNode(j).GetO_value());
}
i_value = w_sum+o_layers[0].GetNode(i).GetBias(); //计算出输出层各个节点的净输入
o_value = 1/(1+exp(-i_value)); //计算出输出层各个节点的净输出
o_layers[0].GetNode(i).SetI_value(i_value);
o_layers[0].GetNode(i).SetO_value(o_value);
w_sum = 0;
}
/*后向传播误差*/
/*输出层的每个节点误差计算*/
for(j=0;j<o_n_num;j++)
{
o_value = o_layers[0].GetNode(j).GetO_value();
t_value = o_layers[0].GetNode(j).GetT();
err = o_value*(1-o_value)*(t_value-o_value); //输出层相应节点误差
o_layers[0].GetNode(j).SetErr(err);
}
/*隐藏层每个节点误差计算*/
/*倒数第一层*/
for(j=0;j<h_ln_num;j++)
{
o_value = h_layers[GetNum_h()-1].GetNode(j).GetO_value();
for(i=0;i<o_n_num;i++)
{
w_sum = w_sum+(wp[ih_w_num+hh_w_num+i+j*o_n_num].GetW_w())*(o_layers[0].GetNode(i).GetErr());
}
err = o_value*(1-o_value)*w_sum;
h_layers[GetNum_h()-1].GetNode(j).SetErr(err);
w_sum = 0;
}
/*其它层*/
//n = ih_w_num+hh_w_num;
m = 0;
for(i=GetNum_h()-1;i>0;i--)
{
m = m+h_layers[i].GetNode_Num()*h_layers[i-1].GetNode_Num();
for(j=0;j<h_layers[i-1].GetNode_Num();j++)
{
o_value = h_layers[i-1].GetNode(j).GetO_value();
for(k=0;k<h_layers[i].GetNode_Num();k++)
{
w_sum = w_sum + (wp[n-m+j*h_layers[i].GetNode_Num()+k].GetW_w())*(h_layers[i].GetNode(k).GetErr());
}
err = o_value*(1-o_value)*w_sum;
h_layers[i-1].GetNode(j).SetErr(err);
w_sum = 0;
}
}
/*更新整个网络的权重和偏倚值*/
/*隐藏层和输入层之间的权重更新*/
max_w = l*(h_layers[0].GetNode(0).GetErr())*(i_layers[0].GetNode(0).GetI_value()); //初始化max_w
for(j=0;j<i_n_num;j++)
{
for(i=0;i<h_n_num;i++)
{
change_w = l*(h_layers[0].GetNode(i).GetErr())*(i_layers[0].GetNode(j).GetI_value());
m_w = wp [m_w_id].GetW_w() + change_w;
wp[m_w_id].SetW_w(m_w);
if(change_w>max_w)
{
max_w = change_w;
}
m_w_id++;
}
}
/*隐藏层和隐藏层之间的权重更新*/
for(i=0;i<GetNum_h()-1;i++)
{
for(j=0;j<h_layers[i].GetNode_Num();j++)
{
for(k=0;k<h_layers[i+1].GetNode_Num();k++)
{
change_w = l*(h_layers[i+1].GetNode(k).GetErr())*(h_layers[i].GetNode(j).GetO_value());
m_w = wp[m_w_id].GetW_w() + change_w;
wp[m_w_id].SetW_w(m_w);
if(change_w>max_w)
{
max_w = change_w;
}
m_w_id++;
}
}
}
/*隐藏层和输出层之间的权重更新*/
for(j=0;j<h_ln_num;j++)
{
for(i=0;i<o_n_num;i++)
{
change_w = l*(o_layers[0].GetNode(i).GetErr())*(h_layers[GetNum_h()-1].GetNode(j).GetO_value());
m_w = wp [m_w_id].GetW_w() + change_w; //按公式计算
wp[m_w_id].SetW_w(m_w);
if(change_w>max_w)
{
max_w = change_w;
}
m_w_id++;
}
}
/*隐藏层和输出层节点的偏倚更新*/
/*隐藏层*/
for(i=0;i<GetNum_h();i++)
{
for(j=0;j<h_layers[i].GetNode_Num();j++)
{
m_bas = h_layers[i].GetNode(j).GetBias() + l*(h_layers[i].GetNode(j).GetErr());
h_layers[i].GetNode(j).SetBias(m_bas);
}
}
/*输出层*/
for(j=0;j<o_n_num;j++)
{
m_bas = o_layers[0].GetNode(j).GetBias() + l*(o_layers[0].GetNode(j).GetErr()); //按公式计算
o_layers[0].GetNode(j).SetBias(m_bas);
}
} //周期结束
p_data = temp;
if(max_w<=m_min_w)
{
isStop = true;
}
}
}
void CNeural_NetWork::TD_Train(float *p_data,double num_data,double m_err_kind)
{
int i,j,k,m,n,t; //循环计数变量
float i_value,o_value; //临时变量用于存储节点净输入和净输出
float err; //临时变量存储节点误差
float t_value; //临时变量存储输出节点期望
short h_n_num,o_n_num,i_n_num,h_ln_num,h_an_num=0; //分别存储隐藏层第一层节点数和输出层节点数,输入层节点数,
//隐藏层最后一层节点数,隐藏层总的节点数
short ih_w_num =0,hh_w_num = 0; //ih_w_num,输入层到隐藏层第一层的权重总数,hh_w_num隐藏层之间的权重总数
short m_w_id; //权重主标识
float m_w; //临时变量存储权重
float m_bas; //临时变量存储偏倚
int idx = 0; //数据数组的行索引
double err_kind=0; //实际分类误差百分比
double err_kind_num=0;//一周期内元组误分类数
isStop = false;
h_n_num = h_layers[0].GetNode_Num();
o_n_num = o_layers[0].GetNode_Num();
i_n_num = i_layers[0].GetNode_Num();
h_ln_num = h_layers[GetNum_h()-1].GetNode_Num();
for(j=0;j<GetNum_h();j++)
{
h_an_num = h_an_num + h_layers[j].GetNode_Num();
}
ih_w_num = i_layers[0].GetNode_Num()*h_layers[0].GetNode_Num();
for(int ii_h=0;ii_h<GetNum_h()-1;ii_h++)
{
hh_w_num = hh_w_num+h_layers[ii_h].GetNode_Num()*h_layers[ii_h+1].GetNode_Num();
}
float w_sum = 0; //w_sum存储节点加权和
float *temp;
temp = p_data;
/*算法开始*/
while(!isStop)
{
for(t=0;t<num_data;t++) //周期开始
{
m_w_id = 0; //权重主标识清零
for(i=0;i<i_n_num;i++)
{
i_layers[0].GetNode(i).SetI_value(*p_data); //设置元组输入层单元的输入值
p_data++;
}
for(i=0;i<o_n_num;i++)
{
o_layers[0].GetNode(i).SetT(*p_data); //设置元组输出层单元对应期望
p_data++;
}
/*向前传播输入*/
for(i=0;i<h_n_num;i++)
{
for(j=0;j<i_n_num;j++)
{
k = j*h_n_num;
w_sum = w_sum+(wp[k+i].GetW_w())*(i_layers[0].GetNode(j).GetI_value());
}
i_value = w_sum+h_layers[0].GetNode(i).GetBias(); //计算出隐藏层第一层各个节点的净输入
o_value = 1/(1+exp(-i_value)); //计算出隐藏层第一层各个节点的净输出
h_layers[0].GetNode(i).SetI_value(i_value);
h_layers[0].GetNode(i).SetO_value(o_value);
w_sum = 0;
}
/////////////////////////////////////////////////////
n = h_n_num*i_n_num;
for(i=0;i<GetNum_h()-1;i++)
{
for(j=0;j<h_layers[i+1].GetNode_Num();j++)
{
for(k=0;k<h_layers[i].GetNode_Num();k++)
{
m = k*h_layers[i+1].GetNode_Num();
w_sum = w_sum + (wp[m+j+n].GetW_w())*(h_layers[i].GetNode(k).GetO_value());
}
i_value = w_sum+h_layers[i+1].GetNode(j).GetBias(); //隐藏层其它层净输入
o_value = 1/(1+exp(-i_value)); //隐藏层其它层净输出
h_layers[i+1].GetNode(j).SetI_value(i_value);
h_layers[i+1].GetNode(j).SetO_value(o_value);
w_sum = 0;
}
n = n + h_layers[i].GetNode_Num()*h_layers[i+1].GetNode_Num();
}
/////////////////////////////////////////////////////
for(i=0;i<o_n_num;i++)
{
for(j=0;j<h_ln_num;j++)
{
k = j*o_n_num;
w_sum = w_sum+(wp[(k+i)+(ih_w_num+hh_w_num)].GetW_w())*(h_layers[GetNum_h()-1].GetNode(j).GetO_value());
}
i_value = w_sum+o_layers[0].GetNode(i).GetBias(); //计算出输出层各个节点的净输入
o_value = 1/(1+exp(-i_value)); //计算出输出层各个节点的净输出
o_layers[0].GetNode(i).SetI_value(i_value);
o_layers[0].GetNode(i).SetO_value(o_value);
w_sum = 0;
}
/*后向传播误差*/
/*输出层的每个节点误差计算*/
for(j=0;j<o_n_num;j++)
{
o_value = o_layers[0].GetNode(j).GetO_value();
t_value = o_layers[0].GetNode(j).GetT();
err = o_value*(1-o_value)*(t_value-o_value); //输出层相应节点误差
o_layers[0].GetNode(j).SetErr(err);
if(err>m_err_kind)
{
err_kind_num++;
}
}
/*隐藏层每个节点误差计算*/
/*倒数第一层*/
for(j=0;j<h_ln_num;j++)
{
o_value = h_layers[GetNum_h()-1].GetNode(j).GetO_value();
for(i=0;i<o_n_num;i++)
{
w_sum = w_sum+(wp[ih_w_num+hh_w_num+i+j*o_n_num].GetW_w())*(o_layers[0].GetNode(i).GetErr());
}
err = o_value*(1-o_value)*w_sum;
h_layers[GetNum_h()-1].GetNode(j).SetErr(err);
w_sum = 0;
}
/*其它层*/
//n = ih_w_num+hh_w_num;
m = 0;
for(i=GetNum_h()-1;i>0;i--)
{
m = m+h_layers[i].GetNode_Num()*h_layers[i-1].GetNode_Num();
for(j=0;j<h_layers[i-1].GetNode_Num();j++)
{
o_value = h_layers[i-1].GetNode(j).GetO_value();
for(k=0;k<h_layers[i].GetNode_Num();k++)
{
w_sum = w_sum + (wp[n-m+j*h_layers[i].GetNode_Num()+k].GetW_w())*(h_layers[i].GetNode(k).GetErr());
}
err = o_value*(1-o_value)*w_sum;
h_layers[i-1].GetNode(j).SetErr(err);
w_sum = 0;
}
}
/*更新整个网络的权重和偏倚值*/
/*隐藏层和输入层之间的权重更新*/
for(j=0;j<i_n_num;j++)
{
for(i=0;i<h_n_num;i++)
{
m_w = wp [m_w_id].GetW_w() + l*(h_layers[0].GetNode(i).GetErr())*(i_layers[0].GetNode(j).GetI_value());
wp[m_w_id].SetW_w(m_w);
m_w_id++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -