您的位置:首页 > 理论基础 > 计算机网络

实现一个最简单的神经网络

2016-12-16 17:29 627 查看
这次实现一个最简单的神经网络,这个神经网络能判断输入的是奇数还是偶数


通常咱们写程序

就要写成这样了

If(inputNumber % 2)

{

Print(“输入的是偶数”);

}else

{

Print(“输入的是奇数”);

}

但是神经网络不是这样的

首先来想一下,婴儿时怎么学习的。

婴儿要学习一个东西,比如汉语

婴儿在刚出生的时候是不会任何和汉语相关的知识的

是婴儿在后来逐渐的学习和训练的过程中,才学会了汉语

同样的,假如咱们用写程序来模仿这个过程,那么咱们程序也能想婴儿一样

实现复杂的功能,比如学会汉语。

下面给出神经网络的结构



这就是最简单的神经网络了

现在有m个输入,m个权值

每一个输入x相应的权值,最后把所有值求和,在加上偏执



这就得到了输入

再下面就是一个“激活函数”

最简单的激活函数是“阈值函数”





这里咱们实现一个最简单的神经网络就是利用的这个激活函数

实现需要几个部分

1. 定义权值

2. 定义输入

3. 定义正确的输出

4. 定义计算的输出

5. 初始化权值

6. 训练

7. 验证

程序如下

include “stdafx.h”

/**

*最简单的神经网络,判断奇偶数

* write by sxt

*/

include

include

include

define OddNumber (0) //奇数

define EvenNumber (1) //偶数

define ADJUSTSTEP (1) //定义在训练的时候,每一次调整M值得时候的大小

//权值

int M[10];

//输入

int X[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

//理想输出 0 表示奇数, 1表示偶数,用于训练和计算输出的相比较

//代表数组下标是奇数还是偶数

int Y[10] = {EvenNumber, OddNumber, EvenNumber, OddNumber, EvenNumber, OddNumber, EvenNumber, OddNumber, EvenNumber, OddNumber};

//实际计算输出

int O[10];

//偏置,这个值,这里是任意取值的

int bk = 0;

//初始化权值

void initM ()

{

int x = 0;

//

srand ((unsigned int)time(0));

for (x = 0; x < 10; ++x) {

/* 随机数在 0 - 99 之间 */

M[x] = rand () % 100;

}

}

/* 跃迁型激活函数 */

int active (int m, int x)

{

//输出=权值x输入+偏置

int o = (m * x) + bk;

//这里使用最简单的激活函数
if (o > 0)
{
return 1;
} else {
return 0;
}


}

/* 计算输出向量 */

void calcY ()

{

int x = 0;

for (x = 0; x < 10; ++x) {

O[x] = active (M[x], X[x]);

}

}

/** 根据实际输出向量和理想输出向量调整权向量,

返回 实际输出和理想输出不匹配的数目 **/

int adjustM ()

{

int err = 0;

int x = 0;

//起始这里是10个神经网络,每一个神经网络只能判断一个指定的数的奇偶性
for (x = 0; x < 10; ++x)
{
//这是训练阶段,如果神经元的计算输出和理想输出不相符合,那么改变权值
if (O[x] != Y[x])
{
//这里通过对err进行一个累计,判断是否结束训练
err ++;
//根据先验值判断奇偶性
if (OddNumber == Y[x]) {
//如果是奇数,由于最终输出是 o = (m * x) + bk 应该小于0 所以这里是减号
M[x] -= ADJUSTSTEP;
} else {
//如果是偶数,由于最终输出是 o = (m * x) + bk 应该大于0 所以这里是加号
M[x] += ADJUSTSTEP;
}
}
}

return err;


}

/* 打印权向量 */

void printM ()

{

int x = 0;

for (x = 0; x < 10; ++x) {

printf (“M[%i] = %i\n”, x, M[x]);

}

}

void test (int input)

{

printf (“[%i] [%i] “, M[input], X[input]);

if (active (M[input], X[input]))

{

printf (“%d 是 偶数\n”, input);

} else {

printf (“%d 是 奇数\n”, input);

}

}

int main ()

{

int n = 0;

//随机初始化M中的值
initM ();

/** 一直训练直到能够100%正确为止 **/
while (1)
{
//累加训练次数
n ++;
//计算
calcY ();
int err = adjustM ();
if (0  >= err) {
/** 能够 100 %正确地回答问题了,结束训练 **/
break;
}
printf ("错误数 %d\n", err);
}

printf ("训练正确,训练次数%d\n", n);

printM ();
printf ("偏置 %d 训练次数 %d\n", bk, n);

while (1) {
int a = 0;
scanf ("%i", &a);
if (0 > a || 9 < a) {
break;
}

test (a);
}
return 0;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  神经网络