```
// bp21xor210202.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
/********************************************
**
** 神經網絡實現異或操作
** terry 41313989@qq.com
** 2013.01.18
**
****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define Ni 2 // 輸入層神經元的個數
#define Nm 2 // 隱含層神經元的個數
#define No 1 // 輸出層神經元的個數
#define Enom 0.02 // 誤差下限,達到這個誤差以內即可認為訓練成功
#define MAXSAMPLE 1000 // 樣本的最大個數
#define BP_LEARNING (float)(0.5) // 學習系數
// 輸入層神經元只有傳遞的功能
float HWeight[Ni + 1][Nm]; // 隱含層神經元的輸入權值
float OWeight[Nm + 1][No]; // 輸出層神經元的輸出權值
float inputValue[Ni];
float destValue[No];
float E; // 每輪的誤差
// 訓練的過程
int train(float in[Ni], float d[No]);
// 神經網絡初始化
void init();
// 測試的過程
int processTest(float in[Ni]);
//Sigmoid函數
float Sigmoid(float num);
int main()
{
float input[MAXSAMPLE][Ni]; // 輸入
float dest[MAXSAMPLE][No]; // 目標輸出
float test[Ni]; // 測試輸入
int num;
int i, j;
long count = 0;
// 輸入相關的測試
printf("Please input the number of sample:");
// scanf("%d", &num);
num = 4;
for (i = 0; i < num; i++)
{
for (j = 0; j < Ni; j++)
// scanf("%f", &input[i][j]);
input[0][0] = 0; input[0][1] = 0;
input[1][0] = 0; input[1][1] = 1;
input[2][0] = 1; input[2][1] = 0;
input[3][0] = 1; input[3][1] = 1;
for (j = 0; j < No; j++)
// scanf("%f", &dest[i][j]);
dest[0][0] = 0;
dest[1][0] = 1;
dest[2][0] = 1;
dest[3][0] = 0;
}
init();
while (1)
{
E = 0;
for (i = 0; i < num; i++)
{
train(input[i], dest[i]);
}
if (E < Enom)
break;
if (count % 20000 == 0)
printf("第%d迭代的誤差為 %f \n", count, E);
count++;
}
// 訓練好的神經網絡測試
while (1)
{
printf("Please input the test data:");
for (i = 0; i < Ni; i++)
scanf("%f", &test[i]);
processTest(test);
}
return 1;
}
// 測試的過程
int processTest(float in[Ni])
{
int i, j;
float net[Nm], iin[Nm], out[No];
// 計算隱含層的神經元值
for (i = 0; i < Nm; i++)
{
net[i] = 1 * HWeight[0][i];
for (j = 1; j < Ni + 1; j++)
net[i] += HWeight[j][i] * in[j - 1];
}
// 使用S函數
for (i = 0; i < Nm; i++)
iin[i] = Sigmoid(net[i]);
// 計算輸出層的值
for (i = 0; i < No; i++)
{
net[i] = 1 * OWeight[0][i];
for (j = 1; j < Nm + 1; j++)
net[i] += OWeight[j][i] * iin[j - 1];
}
for (i = 0; i < No; i++)
{
out[i] = Sigmoid(net[i]);
printf("%f ", out[i]);
}
printf("\n");
return 1;
}
// 訓練的過程
int train(float in[Ni], float d[No])
{
int i, j;
float net[Nm], iin[Nm], out[No];
float deltaO[No + 1], deltaM[Nm + 1]; // delta值
float temp;
// 計算隱含層的神經元值
for (i = 0; i < Nm; i++)
{
net[i] = 1 * HWeight[0][i];
for (j = 1; j < Ni + 1; j++)
net[i] += HWeight[j][i] * in[j - 1];
}
// 使用S函數
for (i = 0; i < Nm; i++)
iin[i] = Sigmoid(net[i]);
// 計算輸出層的值
for (i = 0; i < No; i++)
{
net[i] = 1 * OWeight[0][i];
for (j = 1; j < Nm + 1; j++)
net[i] += OWeight[j][i] * iin[j - 1];
}
for (i = 0; i < No; i++)
out[i] = Sigmoid(net[i]);
for (i = 0; i < No; i++)
E += (float)fabs(out[i] - d[i]);
// 計算誤差,反向傳播
for (i = 0; i < No; i++)
{
deltaO[i] = out[i] * (1 - out[i])*(d[i] - out[i]);
}
for (i = 0; i < Nm; i++)
{
temp = 0;
for (j = 0; j < No; j++)
{
temp += deltaO[j] * OWeight[i + 1][j];
}
deltaM[i] = iin[i] * (1 - iin[i])*temp;
}
// 調整權值
// 輸出層
for (i = 0; i < No; i++)
{
OWeight[0][i] += BP_LEARNING * 1 * deltaO[i];
for (j = 1; j < Nm + 1; j++)
OWeight[j][i] += BP_LEARNING * iin[j - 1] * deltaO[i];
}
for (i = 0; i < Nm; i++)
{
HWeight[0][i] += BP_LEARNING * 1 * deltaM[i];
for (j = 1; j < Nm + 1; j++)
HWeight[j][i] += BP_LEARNING * in[j - 1] * deltaM[i];
}
return 1;
}
// 神經網絡初始化
void init()
{
int i, j;
int random;
double x;
int stime;
long ltime;
ltime = time(NULL);
stime = (unsigned)ltime / 2;
srand(stime);
for (i = 0; i < Ni + 1; i++)
for (j = 0; j < Nm; j++)
{
// 設定網絡連接的初值取值范圍為(-0.5,0.5)
random = rand() % 100 - 50;
x = random;
x = x / 100;
HWeight[i][j] = (float)x;
}
for (i = 0; i < Nm + 1; i++)
for (j = 0; j < No; j++)
{
random = rand() % 100 - 50;
x = random;
x = x / 100;
OWeight[i][j] = (float)x;
}
}
//Sigmoid函數
float Sigmoid(float num)
{
return (float)(1 / (1 + exp(-num)));
}
//int main()
//{
// std::cout << "Hello World!\n";
//}
```
- BP神經網絡到c++實現等--機器學習“掐死教程”
- 訓練bp(神經)網絡學會“乘法”--用”蚊子“訓練高射炮
- Ann計算異或&前饋神經網絡20200302
- 神經網絡ANN的表示20200312
- 簡單神經網絡的后向傳播(Backpropagration, BP)算法
- 牛頓迭代法求局部最優(解)20200310
- ubuntu安裝numpy和pip3等
- 從零實現一個神經網絡-numpy篇01
- _美國普林斯頓大學VictorZhou神經網絡神文的改進和翻譯20200311
- c語言-普林斯頓victorZhou神經網絡實現210301
- bp網絡實現xor異或的C語言實現202102
- bp網絡實現xor異或-自動錄入輸入(寫死20210202
- Mnist在python3.6上跑tensorFlow2.0一步一坑20210210
- numpy手寫數字識別-直接用bp網絡識別210201