热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用C语言从头开始实现一个神经网络

字幕组双语原文:用C从头实现神经网络英语原文:BuildingNeuralNetworkFrameworkinCusingBackpropagation翻译:雷锋字幕组(Mr.水方

字幕组双语原文:用C从头实现神经网络

英语原文:Building Neural Network Framework in C using Backpropagation

翻译:雷锋字幕组(Mr.水方子)

在本文中,我们将用C语言从头开始实现一个基本的神经网络框架。之所以在C语言中这样做,是因为大多数库和其他高级语言(如Python)都抽象出了实现细节。在C语言中实现反向传播实际上会让我们更详细地了解改变权重和偏差是如何改变网络的整体行为的。

注意:本文假设您了解反向传播算法背后的数学原理。如果你不熟悉,请参考这个。

我们的目标是建立一个通用的框架,其中的层数和神经元将由用户根据他的要求指定。因此,我们将从用户获得以下输入来定义我们的神经网络框架:

1. 层数

2.每层神经元数目

3.学习速率

4.训练例子

5.输出标签

定义层和神经元结构:

一旦我们有了层的数量和每层神经元的数量,我们就可以创建我们的神经网络的架构。但首先我们必须定义神经元和层的结构。

神经元结构将包含以下参数:

用C语言从头开始实现一个神经网络

层结构将有许多神经元在该层和一个指针的neuron_t结构。

用C语言从头开始实现一个神经网络

创建架构:  

现在,让我们使用create_architecture()函数创建我们的神经网络的体系结构。

在下面的代码片段中,外部For循环创建层,内部For循环将指定数量的神经元添加到该层。我们也随机初始化神经元的权值在0到1之间。

用C语言从头开始实现一个神经网络

训练的例子:

我们将使用get_input()函数存储训练示例:

用C语言从头开始实现一个神经网络

得到输出标签:

我们将使用get_desired_exports()函数存储输出标签

用C语言从头开始实现一个神经网络

前向传递:

第i层第j个神经元的激活与(i−1)第(i−1)层神经元的激活关系为:

用C语言从头开始实现一个神经网络

注意:σ是激活函数。这里输出层使用sigmoid激活函数,隐藏层使用Relu激活函数。

sigmoid函数:

用C语言从头开始实现一个神经网络

Relu函数:

用C语言从头开始实现一个神经网络

让我们实现forward_prop()函数

用C语言从头开始实现一个神经网络

反向传递:

反向传播的目标是反向传播错误并更新权值以最小化错误。这里,我们将使用均方误差函数来计算误差。

用C语言从头开始实现一个神经网络

权重(dw)和偏差(dbias)的变化是使用成本函数C对网络中的权重和偏差的偏导数(∂C/ ∂weights和∂C/∂ bias)来计算的。

sigmoid函数的导数:

用C语言从头开始实现一个神经网络

relu函数的导数:

用C语言从头开始实现一个神经网络

反向传播背后的四个基本方程:

用C语言从头开始实现一个神经网络

让我们在back_prop()函数中实现这些公式:

用C语言从头开始实现一个神经网络

更新权重:

在每个epoch中,我们将使用update_weights()函数更新网络权值和偏差

用C语言从头开始实现一个神经网络

测试框架:

现在我们已经准备好了所有的部分,我们将验证框架的工作情况。因此,让我们创建一个4层的神经网络,输入层有2个神经元,第一隐含层有4个神经元,第二隐含层有4个神经元,输出层有1个神经元。另外,隐藏的和输出的神经元会有偏差。

用C语言从头开始实现一个神经网络

现在,我们可以针对不同的逻辑门训练这个神经网络,比如XOR, OR等等。在下面的示例中,我们将实现XOR gate。

首先,提供所需的层数和每层神经元的数目:

Enter the number of Layers in Neural Network: 4

Enter number of neurons in layer[1]: 2

Enter number of neurons in layer[2]: 4

Enter number of neurons in layer[3]: 4

Enter number of neurons in layer[4]: 1

神经网络体系结构将根据给定的规范创建:

Created Layer: 1

Number of Neurons in Layer 1: 2

Neuron 1 in Layer 1 created

Neuron 2 in Layer 1 created

Created Layer: 2

Number of Neurons in Layer 2: 4

Neuron 1 in Layer 2 created

Neuron 2 in Layer 2 created

Neuron 3 in Layer 2 created

Neuron 4 in Layer 2 created

Created Layer: 3

Number of Neurons in Layer 3: 4

Neuron 1 in Layer 3 created

Neuron 2 in Layer 3 created

Neuron 3 in Layer 3 created

Neuron 4 in Layer 3 created

Created Layer: 4

Number of Neurons in Layer 4: 1

Neuron 1 in Layer 4 created

所有的权值将在0和1之间随机初始化。

接下来,提供学习率和输入训练示例。下面是XOR逻辑门的真值表。

用C语言从头开始实现一个神经网络

我们将以上4个输入作为神经网络的训练实例。

Enter the learning rate (Usually 0.15): 0.15

Enter the number of training examples: 4

Enter the Inputs for training example[0]: 0 0

Enter the Inputs for training example[1]: 0 1

Enter the Inputs for training example[2]: 1 0

Enter the Inputs for training example[3]: 1 1

输出标签: 

 Enter the Desired Outputs (Labels) for training example[0]: 0

Enter the Desired Outputs (Labels) for training example[1]: 1

Enter the Desired Outputs (Labels) for training example[2]: 1

Enter the Desired Outputs (Labels) for training example[3]: 0

我们的神经网络将在这4个训练实例上训练20000个epoch。现在,测试训练好的神经网络:

Enter input to test: 0 0

Output: 0

Enter input to test: 0 1

Output: 1

Enter input to test: 1 0

Output: 1

Enter input to test: 1 1

Output: 0

总结:

这是一个神经网络框架的基本实现,目的是了解神经网络的基本原理和反向传播算法。可以通过实现各种损失函数和提供保存/装载重量来增强代码。


雷锋字幕组是由AI爱好者组成的志愿者翻译团队;团队成员有大数据专家、算法工程师、图像处理工程师、产品经理、产品运营、IT咨询人、在校师生;志愿者们来自IBM、AVL、Adobe、阿里、百度等知名企业,北大、清华、港大、中科院、南卡罗莱纳大学、早稻田大学等海内外高校研究所。

了解字幕组请联系微信:tlacttlact

转载请联系字幕组微信并注明出处:雷锋字幕组

雷锋网(公众号:雷锋网)雷锋

雷锋网版权文章,未经授权禁止转载。详情见。


用C语言从头开始实现一个神经网络


推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文讨论了如何在dotnet桌面(Windows)应用程序中添加图标。作者提到可以使用dotnet命令行工具与resource.rc文件一起使用来为标准.NET核心应用程序添加图标。作者还介绍了在创建控制台应用程序时如何编辑projeto1.csproj文件来添加图标。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 小程序获取用户信息按钮返回中文地址
    1.我是根据官方文档中描述去写的按钮 可以看到button中加了zh_CNopen-typegetUserInfobindgetuserinfogetU ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
author-avatar
hanhan2502883243
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有