当前位置: 首页 > 科技观察

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

时间:2023-03-20 23:37:54 科技观察

在本文中,我们将用C从零开始实现一个基本的神经网络框架。这是在C中完成的,因为大多数库和其他高级语言(如Python)抽象掉了实施细节。在C中实现反向传播实际上会让我们更详细地了解改变权重和偏差如何改变网络的整体行为。注意:本文假定您了解反向传播算法背后的数学原理。我们的目标是建立一个通用框架,其中层数和神经元数将由用户根据他的要求指定。因此,我们将从用户那里获得以下输入来定义我们的神经网络框架:1.层数2.每层神经元数3.学习率4.训练示例5.输出标签定义层和神经元结构:一旦我们给定层数和每层中的神经元数,我们可以创建神经网络的架构。但首先我们必须定义神经元和层的结构。神经元结构将包含以下参数:层结构将具有该层中的神经元数量和指向neuron_t结构的指针。创建架构:现在,让我们使用create_architecture()函数创建神经网络的架构。在下面的代码片段中,外部For循环创建层,内部For循环将指定数量的神经元添加到层。我们还在0和1之间随机初始化神经元权重。训练示例:我们将使用get_input()函数来存储训练示例:获取输出标签:我们将使用get_desired_exports()函数来存储输出标签层中神经元的激活关系(i?1)是:注:σ是激活函数。这里输出层使用sigmoid激活函数,隐藏层使用Relu激活函数。sigmoid函数:Relu函数:让我们实现forward_prop()函数Backwardpass:反向传播的目标是反向传播误差并更新权重以最小化误差。在这里,我们将使用均方误差函数来计算误差。使用成本函数C相对于网络中的权重和偏差(?C/?weights和?C/?bias)的偏导数来计算权重(dw)和偏差(dbias)的变化。sigmoid函数的导数:relu函数的导数:反向传播背后的四个基本方程:让我们在back_prop()函数中实现这些公式:更新权重:在每个时期,我们将使用update_weights()函数来更新网络权重和偏差测试框架:既然我们已经准备好了所有的部分,我们将验证该框架是否有效。因此,让我们创建一个4层神经网络,输入层有2个神经元,第一个隐藏层有4个神经元,第二个隐藏层有4个神经元,输出层有1个神经元。此外,隐藏和输出神经元将有偏差。现在,我们可以为异或、或等不同的逻辑门训练这个神经网络。在下面的例子中,我们将实现一个异或门。首先,提供所需的层数和每层中的神经元数:输入神经网络中的层数:4输入层[1]中的神经元数:2输入层[2]中的神经元数:4输入层[3]中的神经元数:4输入层[4]中的神经元数:1将根据给定的规范创建神经网络架构:创建的层:1层1中的神经元数:2层中的神经元11createdNeuron2inLayer1createdCreatedLayer:2NumberofNeuronsinLayer2:4Neuron1inLayer2createdNeuron2inLayer2createdNeuron3inLayer2createdNeuron4inLayer2createdCreatedLayer:3数量第3层中的神经元:4第3层中的神经元1在第3层中创建了神经元2在第3层中创建了神经元3在La中创建了神经元4yer3createdCreatedLayer:4NumberofNeuronsinLayer4:1Neuron1inLayer4created所有权重将在0和1之间随机初始化接下来,提供学习率和输入训练示例。下面是XOR逻辑门的真值表。我们使用上述4个输入作为神经网络的训练示例。输入学习率(通常为0.15):0.15输入训练样例数:4输入训练样例输入[0]:00输入训练样例输入[1]:01输入训练样例输入[2]]:10EntertheInputsfortrainingexample[3]:11输出标签:EntertheDesiredOutputs(Labels)fortrainingexample[0]:0EntertheDesiredOutputs(Labels)fortrainingexample[1]:1EntertheDesiredOutputs(Labels)fortrainingexample[2]:1EntertheDesiredOutputs(Labels)fortrainingexample[3]:0我们的神经网络将在这4个训练实例上训练20000个epoch。现在,测试经过训练的神经网络:输入测试输入:00输出:0输入测试输入:01输出:1输入测试输入:10输出:1输入测试输入:11输出:0摘要:这是一个神经网络框架的基本实现,目的是了解神经网络的基本原理和反向传播算法。可以通过实现各种损失函数和提供保存/加载权重来增强代码。