神经网络是最著名且使用最广泛的算法之一。在监督学习中,我们标记了输出数据,我们将预测输出与实际标签进行比较,然后计算误差。在神经网络中,我们以同样的方式定义神经网络体系结构,通过比较实际标签和预测标签来计算误差,然后使用某种优化算法来优化该误差。训练神经网络最广泛使用的算法是反向传播和梯度下降。但是,我们可以使用任何优化算法来训练我们的神经网络模型。今天我们将看看如何在Python中使用Numpy用粒子群优化来训练神经网络模型。
神经网络
导入Python库
导入sklearn加载Iris flower机器学习数据集,pso_numpy使用PSO算法,numpy执行神经网络的forward pass。
加载机器学习数据集
从sklearn加载Iris数据集,并将输入数据分配给X,将目标标签分配给Y。
定义架构
在神经网络模型中定义输入,隐藏和输出节点数。
One-hot编码
如果我们要计算分类交叉熵损失,则使用One-hot编码。将唯一的向量分配给每个目标标签(类)。该函数将Y作为输入,并为每个类返回One-hot编码向量。
Softmax激活
使用Softmax函数从logits(不应用任何激活的最后一层的输出)计算每个类的概率。
损失函数
我们可以根据输入使用这两个损失函数之一。如果我们不将目标标签编码为one hot向量,则使用负对数似然法,如果我们对标签进行编码,则使用分类交叉熵。这这里probs是计算概率,Y是目标类的实际标签。
Forward Pass
该函数执行神经网络的forward pass,使用预测标签和实际标签计算误差,然后将该误差返回给PSO,PSO会优化误差并更新权重。它需要神经网络层中神经元之间的连接的X(输入数据),Y(目标标签)和W(权重)。
预测
需要X(输入)和W(在PSO训练完成后的训练权重)。
准确度
使用实际标签和预测标签作为输入来计算测试数据的准确性。它使用Y(实际标签)和Y_pred(预测标签),然后计算真实预测的数量,然后取其平均值。
运行
这里我们只定义了no_solution(PSO中的粒子数),no_dim(PSO中每个粒子的维数),w_range(权重范围),lr_range(学习速率范围),iw_range(惯性权重范围)和一个元组c作为cognitive和social参数。然后初始化Swarm并使用forward_pass(orward pass函数)、X(输入)、Y(标签)、print_step(要查看损失的迭代次数)和迭代次数调用优化函数。优化后,调用方法get_best_solution()与Swarm对象一起获得最佳的一对权重。然后传递该对权重以预测并获得输出,最后计算模型的准确性。
结果
正如你所看到的,对于训练集来说,结果很不错。如果PSO的参数值被正确分配和训练了足够多的迭代次数,它也可以为其他应用提供良好的结果。
粒子群优化
现在,我们已经完成有关神经网络的讨论,让我们讨论粒子群优化。
粒子
创建Particle类,该构造函数接受no_dim(维数)、x_range(搜索空间范围)、v_range(每个维数的速度范围)的输入。
群
创建Swarm类,并将参数传递给其构造函数,no_particle(粒子数,其中每个粒子是一对权重的独立解),no_dim(维数,其中维度是指神经网络模型的单个权重或偏差) ,x_range(搜索空间范围或以神经网络为单位的权重范围),v_range(每个维度的速度或每个权重参数的学习率),iw_range(惯性权重范围)和c是cognitive和social因子对。
优化
该optimize函数接受函数(由forward pass计算损失),X(输入),(标签),print_step(print step to log loss),ITER(迭代数或训练模型的epochs数)。在每个epoch,它将通过X、W和Y来进行函数运算并计算更新粒子的损失。
最优解
通过对函数进行优化,得到最优解。