#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<stdio.h>
typedef enum {CUSTOM,SIGMOD} ActionType;
typedef double(*Function)(double);
typedef struct {
int cbSize; //神经网络所占用的内存空间
int szLayer; //层数
double eta;
double momentum;
int *layer; //每层的结点数
ActionType actionType; //激活函数类型
Function act; //激活函数
Function actdiff; //激活函数的导数
double **weights; //权值
double **preWeights; //前一时刻的权值
double **delta; //误差值
double **theta; //阈值
double **preTheta; //前一时刻的阈值
double **output; //每层结点的输出值
void* buffer[0]; //用于存储结点数、权值、前一时刻的权值、误差值、阈值、前一时刻的阈值、结点输出值的空间
}BPAnn;
void MatXMat(double mat1[], double mat2[], double output[], int row, int column, int lcolrrow)
{
for (int i = 0; i < row; ++i)
for (int j = 0; j < column; ++j)
{
int pos = column * i + j;
output[pos] = 0;
for (int k = 0; k < lcolrrow; ++k)
output[pos] += mat1[lcolrrow * i + k] * mat2[column * k + j];
}
}
//随机生成-1.0~1.0之间的随机浮点数
double lfrand()
{
static int randbit = 0;
if (!randbit)
{
srand((unsigned)time(0));
for (int i = RAND_MAX; i; i >>= 1, ++randbit);
}
unsigned long long lvalue = 0x4000000000000000L;
int i = 52 - randbit;
for (; i > 0; i -= randbit)
lvalue |= (unsigned long long)rand() << i;
lvalue |= (unsigned long long)rand() >> -i;
return *(double *)&lvalue - 3;
}
double Sigmod(double x)
{
return 1 / (1 + exp(-x));
}
double SigmodDiff(double y)
{
return y*(1 - y);
}
static int GetCbSize(int szLayer,int layer[])
{
int cbSize = sizeof(BPAnn);
cbSize += sizeof(int)*szLayer;
cbSize += sizeof(double *)*(szLayer*6-5);
cbSize += sizeof(double)*layer[0];
for (int i = 1; i < szLayer; ++i)
{
cbSize += sizeof(double)*layer[i] * layer[i - 1]*2;
cbSize += sizeof(double)*layer[i]*4;
}
return cbSize;
}
void InitBPAnn(void *buffer)
{
BPAnn *pBPAnn = (BPAnn *)buffer;
switch (pBPAnn->actionType) {
case SIGMOD:
pBPAnn->act=Sigmod;
pBPAnn->actdiff = SigmodDiff;
break;
default:
pBPAnn->act = 0;
pBPAnn->actdiff = 0;
break;
}
int szLayer = pBPAnn->szLayer;
pBPAnn->layer = (int *)pBPAnn->buffer;
pBPAnn->output = (double **)(pBPAnn->layer+szLayer);
pBPAnn->delta = pBPAnn->output+szLayer;
pBPAnn->weights = pBPAnn->delta + szLayer - 1;
pBPAnn->theta = pBPAnn->weights + szLayer - 1;
pBPAnn->preWeights = pBPAnn->theta + szLayer - 1;
pBPAnn->preTheta = pBPAnn->preWeights + szLayer - 1;
*(pBPAnn->output) = (double *)(pBPAnn->preTheta + szLayer - 1);
int *layer = pBPAnn->layer;
for (int i = 0; i < szLayer; ++i)
pBPAnn->output[i+1]=pBPAnn->output[i]+layer[i];
for (int i=0;i<szLayer - 1;++i)
pBPAnn->delta[i+1]=pBPAnn->delta[i]+layer[i+1];
for (int i = 0; i < szLayer - 1; ++i)
pBPAnn->weights[i+1]=pBPAnn->weights[i]+layer[i] * layer[i + 1];
for(int i=0;i<szLayer - 1;++i)
pBPAnn->theta[i+1]=pBPAnn->theta[i]+layer[i+1];
long long tmp = pBPAnn->theta[szLayer - 1]-pBPAnn->weights[0];
for(int i=0;i<szLayer - 1;++i)
{
pBPAnn->preWeights[i]=pBPAnn->weights[i]+tmp;
pBPAnn->preTheta[i] = pBPAnn->theta[i]+tmp;
}
}
int SaveBPAnn(BPAnn *pBPAnn,const char *filename)
{
if(!pBPAnn) return 0;
FILE *fp =0;
if((fp = fopen(filename, "wb+")))
{
fwrite(pBPAnn, 1, pBPAnn->cbSize, fp);
return fclose(fp);
}
return 0;
}
BPAnn* LoadBPAnn(const char *filename)
{
if(!filename) return 0;
FILE *fp = 0;
if((fp=fopen(filename, "rb+")))
{
int szfile = 0;
fread(&szfile, 4, 1, fp);
fseek(fp, 0, SEEK_SET);
BPAnn *pBPAnn = (BPAnn *)malloc(szfile);
if(fread(pBPAnn, 1, szfile, fp)<szfile) return 0;
InitBPAnn(pBPAnn);
return pBPAnn;
}
return 0;
}
BPAnn* CreateBPAnn(double eta, double momentum, int layer[],int szLayer, ActionType actionType)
{
int cbSize = GetCbSize(szLayer, layer);
BPAnn* pBPAnn = (BPAnn *)malloc(cbSize);
pBPAnn->cbSize = cbSize;
pBPAnn->eta = eta;
pBPAnn->momentum = momentum;
pBPAnn->szLayer = szLayer;
pBPAnn->actionType = actionType;
pBPAnn->layer = (int *)pBPAnn->buffer;
for(int i=0;i<szLayer;++i)
pBPAnn->layer[i] = layer[i];
InitBPAnn(pBPAnn);
for(double *i=pBPAnn->weights[0];i!=pBPAnn->preWeights[0];++i)
*i=lfrand();
for(double *i=pBPAnn->preWeights[0];i!=(double *)((unsigned char *)pBPAnn+cbSize);++i)
*i=0;
return pBPAnn;
}
int DestroyBPAnn(BPAnn *pBPAnn)
{
if (!pBPAnn) return 0;
free(pBPAnn);
return 1;
}
static void LoadInput(double input[],BPAnn *pBPAnn)
{
for (int i = 0; i < pBPAnn->layer[0]; ++i)
pBPAnn->output[0][i] = input[i];
}
static void LoadTarget(double target[], BPAnn *pBPAnn)
{
int lastIndex = pBPAnn->szLayer - 1;
double *delta = pBPAnn->delta[lastIndex - 1];
double *output = pBPAnn->output[lastIndex];
for (int i = 0; i < pBPAnn->layer[lastIndex]; ++i)
delta[i] = pBPAnn->actdiff(output[i])*(target[i] - output[i]);
}
static void Forward(BPAnn *pBPAnn)
{
int lastIndex = pBPAnn->szLayer - 1;
int *layer = pBPAnn->layer;
double **weights = pBPAnn->weights;
double **output = pBPAnn->output;
double **theta = pBPAnn->theta;
Function act = pBPAnn->act;
for (int i = 0; i < lastIndex; ++i)
{
MatXMat(output[i], weights[i], output[i + 1], 1, layer[i + 1], layer[i]);
for (int j = 0; j < layer[i + 1]; ++j)
output[i + 1][j] = act(output[i + 1][j] + theta[i][j]);
}
}
static void CalculateDelta(BPAnn *pBPAnn)
{
int lastIndex = pBPAnn->szLayer - 1;
int *layer = pBPAnn->layer;
double **weights = pBPAnn->weights;
double **output = pBPAnn->output;
double **delta = pBPAnn->delta;
Function actdiff = pBPAnn->actdiff;
for (int i = lastIndex-1; i > 0; --i)
{
MatXMat(weights[i], delta[i], delta[i - 1], layer[i], 1, layer[i + 1]);
for (int j = 0; j < layer[i]; ++j)
delta[i - 1][j] *= actdiff(output[i][j]);
}
}
static void AdjustWeights(BPAnn *pBPAnn)
{
int lastIndex = pBPAnn->szLayer - 1;
int *layer = pBPAnn->layer;
double **weights = pBPAnn->weights;
double **output = pBPAnn->output;
double **delta = pBPAnn->delta;
double **preWeights = pBPAnn->preWeights;
double **theta = pBPAnn->theta;
double **preTheta = pBPAnn->preTheta;
double momentum = pBPAnn->momentum;
double eta = pBPAnn->eta;
for (int i = 0; i < lastIndex; ++i)
{
for (int j = 0; j < layer[i]; ++j)
for (int k = 0; k < layer[i + 1]; ++k)
{
int pos = j*layer[i + 1] + k;
preWeights[i][pos] = momentum * preWeights[i][pos] + eta * delta[i][k] * output[i][j];
weights[i][pos] += preWeights[i][pos];
}
for (int j = 0; j < layer[i + 1]; ++j)
{
preTheta[i][j] = momentum*preTheta[i][j] + eta*delta[i][j];
theta[i][j] += preTheta[i][j];
}
}
}
void Train(double input[], double target[],BPAnn *pBPAnn)
{
if(pBPAnn->act&&pBPAnn->actdiff)
{
LoadInput(input, pBPAnn);
Forward(pBPAnn);
LoadTarget(target,pBPAnn);
CalculateDelta(pBPAnn);
AdjustWeights(pBPAnn);
}
}
void Predict(double input[],double output[],BPAnn *pBPAnn)
{
if(pBPAnn->act&&pBPAnn->actdiff)
{
int lastIndex = pBPAnn->szLayer - 1;
LoadInput(input, pBPAnn);
Forward(pBPAnn);
double *result = pBPAnn->output[lastIndex];
for (int i = 0; i < pBPAnn->layer[lastIndex]; ++i)
output[i] = result[i];
}
}
static void ToBinary(unsigned x, unsigned n,double output[])
{
for (unsigned i = 0, j = x; i < n; ++i, j >>= 1)
output[i] = j & 1;
}
static unsigned FromBinary(double output[],unsigned n)
{
int result = 0;
for (int i = n - 1; i >= 0; --i)
result = result << 1 | (output[i] > 0.5) ;//对输出结果四舍五入,并通过二进制转换为数
return result;
}
//使用神经网络进行异或运算,输入为2个0~32767之间的数,前15节点为第1个数二进制,后15节点为第2个数二进制,输出为结果的二进制
static void TestXor()
{
int layer[] = { 30,48,15 };
BPAnn *bp = CreateBPAnn(0.25, 0.9, layer, 3, SIGMOD);
double input[30], output[15];
int error = 0;
for (int j = 0; j < 100; ++j) {
for (int i = 0; i < 400; ++i)
{
unsigned x = rand() & 32767;
unsigned y = rand() & 32767;
ToBinary(x << 15 | y, 30, input);
ToBinary(x^y, 15, output);
Train(input, output, bp);
}
printf("%02d%%\n", j + 1);
}
printf("\nfinish train\n");
for (int i = 0; i < 2000; ++i)
{
unsigned x = rand() & 32767;
unsigned y = rand() & 32767;
ToBinary(x << 15 | y, 30, input);
Predict(input, output, bp);
unsigned result = FromBinary(output, 15);
if(result != (x^y))
{
++error;
printf("%u^%u=%u\tpredict=%u\n", x, y, x^y, result);
}
}
printf("error = %d\n", error);
SaveBPAnn(bp,"BP.ann");
DestroyBPAnn(bp);
}
int main()
{
TestXor();
return 0;
}
相关推荐
Python实现BP神经网络算法详解与源代码
误差反向传播是BP神经网络训练的核心。其主要思想是将网络输出结果与真实结果进行比较,然后计算误差,并反向传播误差,最小化误差来调整网络参数,使得网络输出结果更接近真实结果。本文将介 绍BP神经网络的基本原理及其Python实现。BP神经网络由输入层、隐藏层和输出层组成。其中,输入层接受原始数据,隐藏层进行数据特征提取和转换,输出层输出预测结果。下面通过一个简单的例子来说明BP神经网络算法的实现。我们使用一个简单的例子来测试我们的代码,该例子实现异或门的预测功能。运行上面的代码,我们将得到异或门的预测结果。
BP神经网络预测回归MATLAB代码(代码完整可直接用,注释详细,可供学习)
BP神经网络预测回归MATLAB代码(代码完整可用,复制后即可运行使用,不懂也可直接使用,操作简单)
BP神经网络解决异或问题的深度剖析
在人工智能领域,BP神经网络(Backpropagation Neural Network)是一个核心概念,它属于前馈神经网络的一种,通过反向传播算法实现网络权重的迭代优化。BP网络因其结构简单、学习能力强,被广泛应用于函数逼近、模式识别、数据分析等众多领域。接下来的章节将深入探讨BP神经网络的网络结构、权重调整、反向传播算法的原理和机制,以及在解决特定问题如异或问题中的应用方法。在讨论反向传播算法之前,首先需要理解损失函数。损失函数衡量的是模型预测值与实际值之间的差异。
BP神经网络及python实现(详细)
本篇文章关于BP神经网络的算法实现相对来说通俗易懂,讲解下至关于函数变量的解释,上至关于BP算法中涉及的前向传播及反向传播的原理、再至其过程中涉及的公式详细推导都有笔者的一些思考笔记。本文也对标准的BP神经网络进行几处改进,目的都是为了提高训练速度。另外,若文章存在一些理论错误请各位不吝赐教,当然,在阅读过程中若有些地方不明白可以在评论区留言!
bp神经网络 C语言实现
用C语言实现的bp神经网络库,接口都已经写好,直接调用即可,有完善的注释,没有改进过得原版bp网络实现
EDEM基础操作指南
EDEM(Enhanced Discrete Element Method)是一种用于模拟颗粒物料行为的软件工具。它可以模拟颗粒的碰撞、流动、堆积等过程,广泛应用于颗粒物料工程、振动筛分、堆垛机械、矿山开采等领域。本文将介绍EDEM的基础操作步骤,并提供相应的源代码示例。以上是EDEM的基础操作步骤。通过创建EDEM项目、定义颗粒材料、导入几何模型、设置边界条件、创建颗粒流场和运行模拟,您可以开始模拟颗粒物料的行为并进行相应的分析和优化。请根据您的具体需求和场景进行相应的参数设置和功能调用。
用BP神经网络解决异或问题
初步的神经网络入门分为三篇 1:神经网络简析 2:Back Propagation算法 3:用BP神经网络解决异或问题 这一篇主要是讲解一下关于用BP神经网络解决异或问题 对于我们的输入 [0,0],[0,1],[1,0],[1,1] 对于我们的输出 0或1 这里我们需要借用上一篇文章的一张图片 构建双层神经网络 #导入numpy import numpy as ...
Cadence Virtuoso Layout 版图绘制
画好原理图,打好pin脚(pin最好以全大写的形式书写,以防后续操作中可能出现Bug) 查看所使用工艺库的design rule文件,确定栅格单位设置大小 在准备绘制的原理图界面启动layout XL/GXL 在layout界面按e,设置网格大小与design rule匹配 直接根据原理图生成版图 根据原理图连接关系显示版图中未连接的飞线 查看和更改原理图与版图中器件对应的链接关系 shift + f:显示器件版图细节 版图的构成:元器件(工艺厂商提供)、器件连接、阱连接、IO和PAD模拟电路
BP神经网络求解异或算法
BP神经网络求解异或算法 目录BP神经网络求解异或算法一、BP神经网络二、激活函数三、异或求解 一、BP神经网络 BP算法包括信号的前向传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行。 正向传播时,输入信号通过隐含层作用于输出节点,经过非线性变换,产生输出信号,若实际输出与期望输出不相符,则转入误差的反向传播过程。 误差反传是将输出误差通过隐含层向输入层逐层反传,并将误差分摊给各层所有单元,以从各层获得的误差信号作为调整各单元权值的依据。通过
小智AI MCP协议实战:从语音指令到设备响应的完整链路拆解
本文深入拆解了小智AI MCP协议在智能语音交互中的完整工作流程。通过一个“调节音量”的真实场景,详细阐述了从语音采集、云端AI意图理解与决策,到MCP协议下的工具调用、设备端执行,最终完成语音反馈的每一个技术环节。文章重点分析了MCP协议如何通过标准化的交互模型,解决AI意图与设备控制间的“最后一公里”通信难题,实现高效可靠的设备响应。
别再手动查日志了!用Dify+Zabbix打造你的专属运维“嘴替”(保姆级配置流程)
本文详细介绍了如何利用Dify平台与Zabbix监控系统集成,构建智能运维对话系统,实现自然语言交互的运维管理。通过保姆级配置流程,帮助运维工程师提升查询效率、降低学习成本,打造企业级智能运维解决方案。
BP神经网络
BP(Back Propagation) 算法是神经网络深度学习中最重要的算法之一,了解BP算法可以让我们更理解神经网络深度学习模型训练的本质,属于内功修行的部分。
在SAP系统中创建物料 860000000000000082(物料描述为“8680月球广寒宫坦克车”)时,系统报出了一个错误
摘要:SAP系统创建物料"8680月球广寒宫坦克车"时出现"C+020"错误,提示评估区域C916未在物料分类账中设置为生产性。解决方案需进入"会计-控制-产品成本控制-实际成本核算"路径,将评估区域C916手动设置为生产性状态。该操作需由具备权限的系统管理员或FICO顾问执行,建议操作前进行数据备份或在测试环境验证。完成设置后即可重新创建物料。
【深度学习】2:BP算法原理,BP算法解决异或问题
BP神经网络介绍
Matlab之App Designer 一键自动生成带有表格的报告
本文采用案例讲解的方式介绍了采用Matlab中的App Designer开发可视化GUI分析界面后,实现一键自动导出带有表格报告的方法和步骤。可以实现从报告编制等繁琐的工作中解脱出来。
RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试
Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。
python bp神经网络 异或_【神经网络】BP算法解决XOR异或问题MATLAB版
第一种%%%用神经网络解决异或问题clearclcclosems=4;%设置4个样本a=[0 0;0 1;1 0;1 1];%设置输入向量y=[0,1,1,0];%设置输出向量n=2;%输入量的个数m=3;%隐层量的个数k=1;%输出层的个数w=rand(n,m);%为输入层到隐层的权值赋初值v=rand(m,k);%为隐层到输出层的权值赋权值yyuzhi=rand(1,m);%为输入层到隐层的阈...
lammps教程:非晶sio2建模方法
大家好,我是小马老师。 本文介绍非晶sio2的建模方法。 sio2的建模方法有很多,可以下载cif文件使用atomsk转为data文件,也可以直接在ms中导入sio2结构,这些方法建的sio2都是标准的sio2晶体。 如果要建立非晶状态的sio2,就是把排列规则的sio2变成无序排列的sio2。 非晶建模方法有很多,在lammps中,可以通过高温高压的方法打乱sio2的排列实现非晶建模。 代码中的温度和步数可根据需要自己调整。 下面给出in文件案例代码。 units metal atom
BP神经网络原理与异或实例分析
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录BP神经网络原理介绍一、BP神经网络算法原理是什么?二、激活函数1.激活函数作用三、BP神经网络异或实例分析1.问题:2.分析:3.代码总结 BP神经网络原理介绍 BP神经网络算法(Back-Propagation Neural Network) 一、BP神经网络算法原理是什
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
入门讲解:使用numpy实现简单的神经网络(BP算法)
用pytorch跟tensorflow实现神经网络固然爽。但是想要深入学习神经网络,光学会调包是不够的,还是得亲自动手去实现一个神经网络,才能更好去理解。 一、问题介绍 传说中线性分类器无法解决的异或分类问题。我们就拿它来作为我们神经网络的迷你训练数据。把输入数据拼成一个矩阵X: ...
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
一文看懂——BP神经网络
BP神经网络这么耳熟能详,你还不打算真的详吗QAQ
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
机器学习——神经网络(五):BP神经网络解决异或问题
BP神经网络解决异或问题 BP神经网络的推导、python实现代码及结果视图请移至机器学习——神经网络(四):BP神经网络 单层感知器异或问题请移至机器学习——神经网络(二):单层感知机异或问题 python 3.6 numpy、matplotlib库 import numpy as np import matplotlib.pyplot as plt # 载入数据 x_data = np.array([[1,0,0], [1,0,1],
BP神经网络Python实现异或问题
# -*- coding: UTF-8 -*- import matplotlib as mpl import numpy as np import matplotlib.pyplot as plt #BP神经网络实现异或问题 X=np.array([[1,0,0], [1,0,1], [1,1,0], [1,1
BP神经网络实现异或功能
环境介绍 语言:Py,版本3.6 环境:Anaconda3 (64-bit), 编译器:Spyder,Jupyter Notebook等 实现功能:使用BP神经网络实现异或功能 神经网络搭建的思想 一个神经网络的搭建,需要满足三个条件。 输入和输出 权重(w)和阈值(b) 多层感知器的结构 也就是说,需要事先画出上面出现的那张图。 其中,最困难的部分就是确定权重(w)...
用python实现BP算法 判别异或
BP算法第一次简单实现,遇到了很多问题就记录下来了。
BP神经网络(二)——异或的实现
神经网络算法是如何提取到更多有用的信息,一步步理解并实现全连接神经网络——异或的实现。
2590



被折叠的 条评论
为什么被折叠?



