你想从头开始开发自己的人工智能应用吗?想学习如何在C++中构建一个简单的人工神经元模型吗?在这篇文章中,我们将通过一个非常简单的人工神经元示例来解释。之前我们已经发布了C++中的简单人工神经元模型和C++中的超简单人工神经网络(ANN)示例,我们还发布了基于数组的简单人工神经元模型在C++中的实现。如果你是AI技术的新手,我们强烈推荐你先阅读AI技术入门。
一个简单的ANN模型
我们之前介绍过这个简单的AI神经元模型,让我们回顾一下。一个最小人工神经元包含一个激活值(记为a)、一个激活函数(记为phi())以及加权的(w)输入网络连接。因此,它有一个激活值、一个激活函数,以及一个或多个权重,这取决于它的输入网络数量。
这是一个非常简单的人工智能技术中的人工神经网络。现在让我们通过这个示例来改进我们的神经元模型,并使用数组来创建一个人工神经元模型。
基于结构的人工神经元模型在C++
这是另一个使用结构的简单神经元示例。在C和C++编程中,一个数据结构(struct)是内存中的数据块,将一组数据元素组合在一起,并给它们一个名称,这些数据元素是变量(整数、浮点数、字符串等),称为成员,它们都可以在单个名称下定义为新变量。它们可以有不同的类型和不同的长度。数据结构可以通过使用struct语句来声明,使用以下语法:
struct struct_name {
// 在这里列出数据成员
} dataobject_names;
结构体主要用于C编程语言,你也可以在C++中使用和存储数据。在C++中,通常使用类来存储数据和函数,而不是结构体。结构体和类之间的主要区别是类可以包含数据和函数,而结构体只包含数据,函数可以外部使用。结构体的一个好处是它们具有固定的大小。
一个最小人工神经元包含一个激活值(a)、一个激活函数(phi())以及加权的(w)输入网络连接。因此,我们可以使用结构体在C++中定义一个简单的神经元模型,如下所示,
struct st_neuron {
float a; // 每个神经元的活动
float w[NN+1]; // 神经元之间连接的权重
};
如果所有神经元都相互连接,或者神经元数量很少,这是一个很好的例子。这个例子也非常适合在只能编译C语言的IoT机器上进行计算。这里NN表示神经元的数量,权重的数量取决于网络连接的数量,正确的方法可能是使用指向数组的指针,但我们将在这里使用这个简单模型。现在我们可以为NN数量的神经元创建我们的**n[]**人工神经元结构,如下所示:
struct st_neuron n[NN+1];
我们可以如下定义两个输入神经元(a0, a1)和一个输出神经元(a2)的活动:
n[0].a=0.0;
n[1].a=1.0;
n[2].a=0;
请注意,这里的n[2]是我们的输出神经元,我们将在给定0的情况下计算它的新激活值。
在我们上面的示例中,两个输入神经元连接到输出神经元。因此我们有2个连接,这意味着我们有权重。我们可以如下定义来自两个输入神经元到输出神经元(0到2和1到2)的信号权重:
n[0].w[2]=0.3;
n[1].w[2]=0.2;
现在我们需要一个激活函数,让我们为输出神经元定义一个简单的激活函数phi()(转移函数或阈值):
float phi(float sum) {
return sum; // 线性转移函数 f(sum) = sum
}
我们可以通过激活函数激发我们的人工神经元来计算它的活动。让我们激发n[2],计算输出神经元的激活如下:
n[2].a=phi(n[0].a*n[0].w[2]+n[1].a*n[1].w[2]);
让我们将它们组合成一个完整的C++示例,如下所示:
#include <stdio.h>
#define NN 3 // 神经元数量
struct st_neuron {
float a; // 每个神经元的活动
float w[NN+1]; // 神经元之间连接的权重
float phi; // 每个神经元的活动输出阈值
};
struct st_neuron n[NN+1];
void main() {
// 定义两个输入神经元(a0, a1)和一个输出神经元(a2)的活动
n[0].a=0.0;
n[1].a=1.0;
n[2].a=0;
// 定义来自两个输入神经元到输出神经元(0到2和1到2)的信号权重
n[0].w[2]=0.3;
n[1].w[2]=0.2;
// 激发我们的人工神经元活动,输出将是
n[2].a=phi(n[0].a*n[0].w[2]+n[1].a*n[1].w[2]);
printf("%10.6f\n",n[2].a);
getchar();
return 0;
}
最后说明,
这是一个非常简单的基于结构的人工神经元示例,旨在让你了解如何在C++中开发自己的基于结构的神经元模型。如果你有很多神经元,并且每个神经元都有连接,那么连接和权重应该存储在这个结构之外。你也可以使用指针指向每个神经元结构的网络连接数组。这个示例非常适合理解C++中的简单人工神经元,并且它在只能使用C或C++的IoT上很容易使用。它适用于神经元数量较少的神经网络。