专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
神经网络感知器的C语言实现
2019-07-21 04:14
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
15805
2
1740
感知器是人工神经网络中的一种典型结构, 它的主要的特点是结构简单,对所能解决的问题 存在着收敛算法,并能从数学上严格证明,从而对神经网络研究起了重要的推动作用。
感知器使用特征向量来表示的前馈式人工神经网络,它是一种二元分类器,把矩阵上的输入(实数值向量)映射到输出值
上(一个二元的值)。
数学表达式
是实数的表式
权重
的向量,
是
点积
。
是偏置,一个不依赖于任何输入值的常数。偏置可以认为是激励函数的偏移量,或者给神经元一个基础活跃等级。
(0 或 1)用于对进行分类,看它是肯定的还是否定的,这属于二元分类问题。如果
是负的,那么加权后的输入必须产生一个肯定的值并且大于
,这样才能令分类神经元大于阈值0。从空间上看,偏置改变了决策边界的位置(虽然不是定向的)。
由于输入直接经过权重关系转换为输出,所以感知机可以被视为最简单形式的前馈式人工神经网络。
本文使用C语言编写神经元网络算法,实现与或模式的识别。神经网络层只有一层,且只有一个神经元,算法比较简单,非常适合理解与学习。关于多层感知器,实现更复杂的功能,本人会在接下来的时间里慢慢实现。一下为单个神经元的学习与训练。为监督学习模式
// perceptron.cpp : Defines the entry point for the console application.
//神经元算法(简单感知器)
#include "stdio.h"
//单个神经元定义
typedef struct per_Cell_one
{
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
周亚龙
2019-07-21 05:26
// perceptron.cpp : Defines the entry point for the console application. //神经元算法(简单感知器) #include "stdio.h" //单个神经元定义 typedef struct per_Cell_one { float wq[2]; //输入权值 float intput[2]; //输入信号 float threshold; //神经元阈值 float output; //神经元输出 float g; //神经元的训练速度 }per_Cell_one; int per_init(per_Cell_one *cell) //神经元初始化 { cell->threshold = 1; //设计阈值为1 cell->wq[0] = 0; cell->wq[1] = 0; //设计两个输入权值 cell->g = 0.5; //学习速率 return 1; } float per_Calculation(float intput[2],per_Cell_one *cell) //神经元输出推导 { float net; //输出公式 out = 求和(wq[i] * x[i] - threshold) if(cell->wq[0] * intput[0] + cell->wq[1] * intput[1] >= cell->threshold) net = 1; else net = 0; return net; } //双输入训练感知机 int train_pre(float intput[4][2],float outtput[4],per_Cell_one *cell) //训练感知机 { int i = 0; float ss[2]; float err = 0; for(i = 0;i < 4;i++) { ss[0] = intput[i][0]; ss[1] = intput[i][1]; err = outtput[i] - per_Calculation(ss,cell); //训练 求误差 //权值修正 cell -> wq[0] = cell -> wq[0] + err * intput[i][0] * cell->g; cell -> wq[1] = cell -> wq[1] + err * intput[i][1] * cell->g; //阈值修正 cell->threshold = cell->threshold - err * cell->g; } //学习完毕 return 1; } //简单感知器参数输出 void Output_parameter(per_Cell_one *cell) { printf("/****这是一个简单感知器****/ "); printf("/****仅有一个神经元构成****/ "); printf("权值 1 2 %f %f ",cell->wq[0],cell->wq[1]); printf("神经元阈值 %f ",cell->threshold); printf("学习速度 %f ",cell->g); } int main() { per_Cell_one cell; //定义一个神经元 //设计训练数组 float And_intput[4][2] = {{0,0},{0,1},{1,0},{1,1}}; float And_output[4] = {0,0,0,1}; float Or_intput[4][2] = {{0,0},{0,1},{1,0},{1,1}}; float Or_output[4] = {0,1,1,1}; float aa[2] = {1,1}; int i = 0; float out = 0; per_init(&cell); //初始化神经元 Output_parameter(&cell); out = per_Calculation(aa,&cell); //没训练之前的输出 printf("/****没训练之前的输出****/ "); printf("%f ",out); for(i = 0;i < 20;i++) train_pre(And_intput,And_output,&cell); //训练神经元 out = per_Calculation(aa,&cell); //训练之后的输出 printf("/****训练之后的输出****/ "); printf("%f ",out); Output_parameter(&cell); return 0; }
加载中...
查看其它2个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
一周热门 更多>