路人战队|用C语言从头开始实现一个神经网络
字幕组双语原文:用C从头实现神经网络
英语原文:Building Neural Network Framework in C using Backpropagation
翻译:雷锋字幕组(Mr.水方子)
在本文中 , 我们将用C语言从头开始实现一个基本的神经网络框架 。 之所以在C语言中这样做 , 是因为大多数库和其他高级语言(如Python)都抽象出了实现细节 。 在C语言中实现反向传播实际上会让我们更详细地了解改变权重和偏差是如何改变网络的整体行为的 。
注意:本文假设您了解反向传播算法背后的数学原理 。 如果你不熟悉 , 请参考这个 。
我们的目标是建立一个通用的框架 , 其中的层数和神经元将由用户根据他的要求指定 。 因此 , 我们将从用户获得以下输入来定义我们的神经网络框架:
1. 层数
2.每层神经元数目
3.学习速率
4.训练例子
5.输出标签
定义层和神经元结构:一旦我们有了层的数量和每层神经元的数量 , 我们就可以创建我们的神经网络的架构 。 但首先我们必须定义神经元和层的结构 。
神经元结构将包含以下参数:
层结构将有许多神经元在该层和一个指针的neuron_t结构 。
创建架构:现在 , 让我们使用create_architecture函数创建我们的神经网络的体系结构 。
在下面的代码片段中 , 外部For循环创建层 , 内部For循环将指定数量的神经元添加到该层 。 我们也随机初始化神经元的权值在0到1之间 。
训练的例子:我们将使用get_input函数存储训练示例:
得到输出标签:我们将使用get_desired_exports函数存储输出标签
前向传递:第i层第j个神经元的激活与(i?1)第(i?1)层神经元的激活关系为:
注意:σ是激活函数 。 这里输出层使用sigmoid激活函数 , 隐藏层使用Relu激活函数 。
sigmoid函数:
Relu函数:
让我们实现forward_prop函数
反向传递:反向传播的目标是反向传播错误并更新权值以最小化错误 。 这里 , 我们将使用均方误差函数来计算误差 。
权重(dw)和偏差(dbias)的变化是使用成本函数C对网络中的权重和偏差的偏导数(?C/ ?weights和?C/? bias)来计算的 。
sigmoid函数的导数:
relu函数的导数:
反向传播背后的四个基本方程:
让我们在back_prop函数中实现这些公式:
更新权重:在每个epoch中 , 我们将使用update_weights函数更新网络权值和偏差
推荐阅读
- 周到|马里公开致歉:向因语言问题引起球迷误会表示歉意
- 大河客户端|布局战队,导师各有妙招,《2020中国好声音》收视率蝉联第一
- 周到|“好声音”蝉联省级卫视综艺节目收视第一,首迎抢位战导师布局战队各有妙招
- 通天战队|A股最励志闻泰科技!给华为小米打工到半导体巨头,半年赚17亿
- 阿文带你看足球|高颜值身材傲人,路人王一役走红网络,她是“篮球界江疏影”
- 阿文带你看足球|她是“篮球界江疏影”,高颜值身材傲人,路人王一役走红网络
- 倪妮|倪妮身材什么程度?拍戏被路人偶遇,未P图暴露驼背“筋肉腿”
- |《街舞3》火舞台battle开启 钟汉良战队团魂之力势不可挡
- |《这!就是街舞》第三季火舞台热力喷发,队长领衔齐舞大秀燃炸战队之魂
- 中国侨网|新生无法入境 日本语言学校面临破产
