?? bpnet.h
字號:
/* ========================================== *
* Filename: bpnet.h *
* Description: *
* 一個微型神經網絡,使用BP來調整權值 *
* ========================================== */
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define BP_LEARNING (float)(0.5) // 學習系數
class CBPNet
{
public:
CBPNet();
~CBPNet() {};
float Train(float, float, float);
float Run(float, float);
private:
float m_fWeights[3][3]; // 3個神經元
float Sigmoid(float); // S形函數
};
CBPNet::CBPNet()
{
srand((unsigned)(time(NULL)));
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
// 由于一些原因,微軟提供的rand()函數產生的隨機數是
// 整數,所以需要將之做適當的變換,變到-1~1之間
m_fWeights[i][j] = (float)(rand())/(32767/2) - 1;
}
}
}
//訓練網絡
float CBPNet::Train(float i1, float i2, float d)
{
// 變量
float net1, net2, i3, i4, out;
// 計算隱含層的神經元值
net1 = 1 * m_fWeights[0][0] + i1 * m_fWeights[1][0] +
i2 * m_fWeights[2][0];
net2 = 1 * m_fWeights[0][1] + i1 * m_fWeights[1][1] +
i2 * m_fWeights[2][1];
// 使用S函數
i3 = Sigmoid(net1);
i4 = Sigmoid(net2);
// 計算輸出層的值
net1 = 1 * m_fWeights[0][2] + i3 * m_fWeights[1][2] +
i4 * m_fWeights[2][2];
out = Sigmoid(net1);
//計算誤差,反向傳播
float deltas[3];
deltas[2] = out*(1-out)*(d-out);
deltas[1] = i4*(1-i4)*(m_fWeights[2][2])*(deltas[2]);
deltas[0] = i3*(1-i3)*(m_fWeights[1][2])*(deltas[2]);
// 調整權值
float v1 = i1, v2 = i2;
for(int i=0;i<3;i++)
{
// 如果有必要,改變輸出層的值
if (i == 2)
{
v1 = i3;
v2 = i4;
}
m_fWeights[0][i] += BP_LEARNING*1*deltas[i];
m_fWeights[1][i] += BP_LEARNING*v1*deltas[i];
m_fWeights[2][i] += BP_LEARNING*v2*deltas[i];
}
return out;
}
//S函數
float CBPNet::Sigmoid(float num)
{
return (float)(1/(1+exp(-num)));
}
//運行網絡
float CBPNet::Run(float i1, float i2)
{
float net1, net2, i3, i4;
net1 = 1 * m_fWeights[0][0] + i1 * m_fWeights[1][0] +
i2 * m_fWeights[2][0];
net2 = 1 * m_fWeights[0][1] + i1 * m_fWeights[1][1] +
i2 * m_fWeights[2][1];
i3 = Sigmoid(net1);
i4 = Sigmoid(net2);
net1 = 1 * m_fWeights[0][2] + i3 * m_fWeights[1][2] +
i4 * m_fWeights[2][2];
return Sigmoid(net1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -