遗传算法与深度学习实战(22)——使用Numpy构建神经网络
遗传算法与深度学习实战(22)——使用Numpy构建神经网络
- 0. 前言
- 1. 神经网络基础
- 1.1 简单神经网络的架构
- 1.2 神经网络的训练
- 2. 使用 Numpy 构建神经网络
- 2.1 网络架构
- 2.2 实现神经网络
- 小结
- 系列链接
0. 前言
我们已经学习了如何使用进化算法来优化深度学习网络中的超参数,与简单的随机或网格搜索算法相比,使用进化算法可以改善对超参数的搜索。多种进化算法的变体,如粒子群优化、进化策略和差分进化,可以用于搜索和优化超参数。神经进化涵盖了所有用于改进深度学习的进化算法,在本节中,我们使用 NumPy 构建一个简单的多层感知器 (multi-layer perceptron, MLP) 作为神经进化的基础。
1. 神经网络基础
1.1 简单神经网络的架构
人工神经网络受到人脑运作方式的启发。从本质上讲,它是对线性回归和逻辑回归的一种改进,神经网络在计算输出时引入了多种非线性函数。此外,神经网络在修改网络体系结构以利用结构化和非结构化数据跨多个域解决问题方面具有极大的灵活性。函数越复杂,网络对于输入的数据拟合能力就越大,因此预测的准确性就越高。神经网络的典型结构如下:

神经网络中的层 (layer) 是一个或多个节点(或称计算单元)的集合,层中的每个节点都连接到下一层中的每个节点。输入层由预测输出值所需的输入变量组成。输出层中节点的数量取决于我们要预测连续变量还是分类变量。如果输出是连续变量,则输出层一个节点。
如果输出结果是 n n n 个类别的预测类的分类,则输出层中将有 n n n 个节点。隐藏层用于将输入层的值转换为高维空间中的值,以便我们可以从输入中了解数据的更多特征。隐藏层中节点的工作方式如下:

在上图中, x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn 是自变量, x 0 x_0 x0 是偏置项,类似于线性方程 y = k x + b y=kx+b y=kx+b 里的 b b b, w 1 , w 2 , . . . , w n w_1, w_2, ..., w_n w1,w2,...,wn 是赋予每个输入变量的权重。如果 a a a 是隐藏层中的节点之一,则计算方法如下所示:
a = f ( ∑ w i N w i x i ) a=f(\sum _{w_i} ^N w_ix_i) a=f(wi∑Nwixi)
f f f 函数是激活函数,用于在输入和它们相应的权重值的总和上引入非线性。可以通过使用多个隐藏层实现更强的非线性能力。
综上,神经网络是相互连接的层中节点权重的集合。该集合分为三个主要部分:输入层,隐藏层和输出层。神经网络中可以具有 n n n 个隐藏层,术语“深度学习”通常表示具有多个隐藏层的神经网络。 当神经网络需要学习具有复杂上下文(例如图像识别)或上下文不明显的任务时,就必须具有隐藏层,隐藏层也被称为中间层。
1.2 神经网络的训练
训练神经网络实际上就是通过重复两个关键步骤来调整神经网络中的权重:前向传播和反向传播。
- 在前向传播中,我们将一组权重应用于输入数据,将其传递给隐藏层,对隐藏层计算后的输出使用非线性激活,通过若干个隐藏层后,将最后一个隐藏层的输出与另一组权重相乘,就可以得到输出层的结果。对于第一次正向传播,权重的值将随机初始化。
- 在反向传播中,尝试通过测量输出的误差,然后相应地调整权重以降低误差。神经网络重复正向传播和反向传播以预测输出,直到获得令误差较小的权重为止。
2. 使用 Numpy 构建神经网络
2.1 网络架构
在本节中,我们将实现基本的深度学习系统,使用 NumPy 编写多层感知器,本节并未使用类似 Keras 或 PyTorch 的框架,以便可以清楚地可视化神经网络内部过程。
一个简单的多层感知器 (multi-layer perceptron, MLP) 网络如下所示,可以看到反向传播是如何通过网络传播计算得到的损失的,以及神经进化优化是如何将网络的每个权重/参数替换为基因序列中的值的。实际上,这种进化搜索与超参数搜索类似。

2.2 实现神经网络
为了进一步理解 MLP 及其内部工作原理,我们将使用 NumPy 实现 MLP。然后,研究这个简单网络在各种分类问题上的训练过程。
(1) 使用 sklearn 的 make_datasets 函数构建数据集:
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_model
import matplotlib.pyplot as pltnumber_samples = 100 #@param {type:"slider", min:100, max:1000, step:25}
difficulty = 1 #@param {type:"slider", min:1, max:5, step:1}
problem = "circles" #@param ["classification", "blobs", "gaussian quantiles", "moons", "circles"]
number_features = 2
number_classes = 2
middle_layer = 5 #@param {type:"slider", min:5, max:25, step:1}
epochs = 25000 #@param {type:"slider", min:1000, max:50000, step:1000}def load_data(problem): if problem == "classification":clusters = 1 if difficulty < 3 else 2informs = 1 if difficulty < 4 else 2data = sklearn.datasets.make_classification(n_samples = number_samples,n_features=number_features, n_redundant=0, class_sep=1/difficulty,n_informative=informs, n_clusters_per_class=clusters)if problem == "blobs":data = sklearn.datasets.make_blobs(n_samples = number_samples,n_features=number_features, centers=number_classes,cluster_std = difficulty)if problem == "gaussian quantiles":data = sklearn.datasets.make_gaussian_quantiles(mean=None, cov=difficulty,n_samples=number_samples,n_features=number_features,n_classes=number_classes,shuffle=True,random_state=None)if problem == "moons":data = sklearn.datasets.make_moons(n_samples = number_samples)if problem == "circles":data = sklearn.datasets.make_circles(n_samples = number_samples)return datadata = load_data(problem)
X, Y = dataplt.figure("Input Data")
plt.scatter(X[:, 0], X[:, 1], c=Y, s=40, cmap=plt.cm.Spectral)
下图显示了最高难度级别的数据集示例,修改问题类型以观察每个数据集的变化。对于简单的 MLP 网络来说,最困难的数据集是圆形数据集。

模型参数选项如下表所示:
| 参数 | 描述 | 取值范围 |
|---|---|---|
| number_samples | 数据集样本数 | 100-1000 |
| difficulty | 问题难度系数 | 1-5 |
| problem | 定义数据集所用的函数 | classification = make_classification |
| moons = make_moons | ||
| circles = make_circles blobs = make_blobs Gaussian | ||
| quantiles = make_gaussian_quantiles | ||
| middle_layer | 网络隐藏层数 | 5-25 |
| epochs | 训练迭代次数 | 1000–25000 |
(2) 作为基线,比较 sklearn 的简单逻辑回归(分类)模型:
def show_predictions(model, X, Y, name=""):""" display the labeled data X and a surface of prediction of model """x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))X_temp = np.c_[xx.flatten(), yy.flatten()]Z = model.predict(X_temp)plt.figure("Predictions " + name)plt.contourf(xx, yy, Z.reshape(xx.shape), cmap=plt.cm.Spectral)plt.ylabel('x2')plt.xlabel('x1')
plt.scatter(X[:, 0], X[:, 1],c=Y, s=40, cmap=plt.cm.Spectral)clf = sklearn.linear_model.LogisticRegressionCV()
clf.fit(X, Y)show_predictions(clf, X, Y, "Logistic regression")LR_predictions = clf.predict(X)
print("Logistic Regression accuracy : ", np.sum(LR_predictions == Y) / Y.shape[0])
下图显示了 show_predictions() 函数的输出,该函数用于模型对数据的分类情况的可视化。

(3) 创建 MLP 网络,对其进行训练,并可视化运行结果:
def sigmoid(x):return 1.0 / (1.0 + np.exp(-x)) ## Neural Network
class Neural_Network:def __init__(self, n_in, n_hidden, n_out):# Network dimensionsself.n_x = n_inself.n_h = n_hiddenself.n_y = n_out# Parameters initializationself.W1 = np.random.randn(self.n_h, self.n_x) * 0.01self.b1 = np.zeros((self.n_h, 1))self.W2 = np.random.randn(self.n_y, self.n_h) * 0.01self.b2 = np.zeros((self.n_y, 1))def forward(self, X):""" Forward computation """self.Z1 = self.W1.dot(X.T) + self.b1self.A1 = np.tanh(self.Z1)self.Z2 = self.W2.dot(self.A1) + self.b2self.A2 = sigmoid(self.Z2)def back_prop(self, X, Y):""" Back-progagate gradient of the loss """m = X.shape[0]self.dZ2 = self.A2 - Yself.dW2 = (1 / m) * np.dot(self.dZ2, self.A1.T)self.db2 = (1 / m) * np.sum(self.dZ2, axis=1, keepdims=True)self.dZ1 = np.multiply(np.dot(self.W2.T, self.dZ2), 1 - np.power(self.A1, 2))self.dW1 = (1 / m) * np.dot(self.dZ1, X)self.db1 = (1 / m) * np.sum(self.dZ1, axis=1, keepdims=True)def train(self, X, Y, epochs, learning_rate=1.2):""" Complete process of learning, alternates forward pass,backward pass and parameters update """m = X.shape[0]for e in range(epochs):self.forward(X)loss = -np.sum(np.multiply(np.log(self.A2), Y) + np.multiply(np.log(1-self.A2), (1 - Y))) / mself.back_prop(X, Y)self.W1 -= learning_rate * self.dW1self.b1 -= learning_rate * self.db1self.W2 -= learning_rate * self.dW2self.b2 -= learning_rate * self.db2if e % 1000 == 0:print("Loss ", e, " = ", loss)def predict(self, X):""" Compute predictions with just a forward pass """self.forward(X)return np.round(self.A2).astype(np.int)nn = Neural_Network(2, middle_layer, 1)
nn.train(X, Y, epochs, 1.2)show_predictions(nn, X, Y, "Neural Network")nn_predictions = nn.predict(X)
print("Neural Network accuracy : ", np.sum(nn_predictions == Y) / Y.shape[0])
MLP 网络的训练结果如下所示,使用 MLP 网络的结果比 sklearn 的逻辑回归模型性能更好。但这个简单的网络仍然难以解决所有问题数据集。

下图显示了 MLP 网络在圆圈问题集进行训练后的输出。可以看到,圆圈问题的准确率为 50%,而月亮问题的准确率为 89%。

可以通过完成以下问题进一步理解 MLP 及其训练过程:
- 增加或减少样本数量,然后重新运行代码
- 更改问题类型和难度,然后在每次更改后重新运行代码
- 更改模型参数和中间层,然后重新运行
小结
在本文中, 我们了解了神经网络的相关基础知识,同时利用 Numpy 从零开始实现了神经网络的训练过程——前向传播和反向传播,了解了神经网络的通用训练流程。
系列链接
遗传算法与深度学习实战(1)——进化深度学习
遗传算法与深度学习实战(2)——生命模拟及其应用
遗传算法与深度学习实战(3)——生命模拟与进化论
遗传算法与深度学习实战(4)——遗传算法(Genetic Algorithm)详解与实现
遗传算法与深度学习实战(5)——遗传算法中常用遗传算子
遗传算法与深度学习实战(6)——遗传算法框架DEAP
遗传算法与深度学习实战(7)——DEAP框架初体验
遗传算法与深度学习实战(8)——使用遗传算法解决N皇后问题
遗传算法与深度学习实战(9)——使用遗传算法解决旅行商问题
遗传算法与深度学习实战(10)——使用遗传算法重建图像
遗传算法与深度学习实战(11)——遗传编程详解与实现
遗传算法与深度学习实战(12)——粒子群优化详解与实现
遗传算法与深度学习实战(13)——协同进化详解与实现
遗传算法与深度学习实战(14)——进化策略详解与实现
遗传算法与深度学习实战(15)——差分进化详解与实现
遗传算法与深度学习实战(16)——神经网络超参数优化
遗传算法与深度学习实战(17)——使用随机搜索自动超参数优化
遗传算法与深度学习实战(18)——使用网格搜索自动超参数优化
遗传算法与深度学习实战(19)——使用粒子群优化自动超参数优化
遗传算法与深度学习实战(20)——使用进化策略自动超参数优化
遗传算法与深度学习实战(21)——使用差分搜索自动超参数优化
相关文章:
遗传算法与深度学习实战(22)——使用Numpy构建神经网络
遗传算法与深度学习实战(22)——使用Numpy构建神经网络 0. 前言1. 神经网络基础1.1 简单神经网络的架构1.2 神经网络的训练 2. 使用 Numpy 构建神经网络2.1 网络架构2.2 实现神经网络 小结系列链接 0. 前言 我们已经学习了如何使用进化算法来优化深度学…...
react->Antd->Table调整checkbox默认样式
checkbox默认不展示,hover此行时,出现checkbox,选中后不消失: hover前,设置透明边框; hover时,checkbox出现 选中后 代码块: .ant-checkbox {.ant-checkbox-inner {border: transparent;}}.ant…...
一种ESB的设计
系统架构 ESB包括: ESB总控服务、业务应用集群、业务消息WEB服务、业务消息日志服务、运维管理平台、业务设计器。如下图所示 ESB总控服务 ESB总控服务承载了各项业务的运维和管理。主要包括: 业务流程的管理ESB内部不同模块间的通讯ESB系统设置和管理…...
上位机常用通信方式
1. 串口通信:RS232(设备和PC之间,最常用,短距离)、RS485(工业现场总线,长距离,多点通信) 2. 以太网通信:TCP/IP协议 3. CAN总线通信 4. Modbus协议࿱…...
Vue3中使用LogicFlow实现简单流程图
实现结果 实现功能: 拖拽创建节点自定义节点/边自定义快捷键人员选择弹窗右侧动态配置组件配置项获取/回显必填项验证 自定义节点与拖拽创建节点 拖拽节点面板node-panel.vue <template><div class"node-panel"><divv-for"(item, k…...
《重学Java设计模式》之 工厂方法模式
《重学Java设计模式》之 建造者模式 《重学Java设计模式》之 原型模式 《重学Java设计模式》之 单例模式 模拟发奖多种商品 工程结构 奖品发放接口 package com.yys.mes.design.factory.store;public interface ICommodity {/*** Author Sherry* Date 14:20 2024/11/6**/voi…...
【大数据学习 | kafka】kafka的数据存储结构
以上是kafka的数据的存储方式。 这些数据可以在服务器集群上对应的文件夹中查看到。 [hexuanhadoop106 __consumer_offsets-0]$ ll 总用量 8 -rw-rw-r--. 1 hexuan hexuan 10485760 10月 28 22:21 00000000000000000000.index -rw-rw-r--. 1 hexuan hexuan 0 10月 28 …...
知识竞赛答题系统,线上答题小程序链接怎么做?
随着智能手机的普及,越来越多的单位开始在线上开展知识竞赛。这种形式的知识竞赛不仅易于操作,而且参与度更高。那么线上知识竞赛答题系统怎么做呢?自己可以做吗?答案是可以的!借助微信答题系统制作平台风传吧…...
基于SSM的社区物业管理系统+LW参考示例
1.项目介绍 系统角色:管理员、业主(普通用户)功能模块:管理员(用户管理、二手置换管理、报修管理、缴费管理、公告管理)、普通用户(登录注册、二手置换、生活缴费、信息采集、报事报修…...
android——jetpack startup初始化框架
一、jetpack startup Android Jetpack Startup是一个库,它简化了Android应用启动过程,尤其是对于那些需要处理复杂数据绑定和初始化逻辑的应用。它的核心在于提供了一个StartupComponent,用于声明应用的初始化逻辑,这个逻辑会在首…...
英伟达HOVER——用于人形机器人的多功能全身控制器:整合不同的控制模式且实现彼此之间的无缝切换
前言 前几天,一在长沙的朋友李总发我一个英伟达HOVER的视频(自从我今年年初以来持续不断的解读各大顶级实验室的最前沿paper、以及分享我司七月在具身领域的探索与落地后,影响力便越来越大了,不断加油 ),该视频说的有点玄乎&…...
GEE代码学习 day17
13.2 地球上到处都有许多图像吗? 我们可以使用下面的代码将这个 reducer count 应用于我们过滤后的 ImageCollection。我们将返回相同的数据集并筛选 2020 年,但没有地理限制。这将收集来自世界各地的图像,然后计算每个像素中的图像数量。以…...
论文阅读笔记-Covariate Shift: A Review and Analysis on Classifiers
前言 标题:Covariate Shift: A Review and Analysis on Classifiers 原文链接:Link\ 我们都知道在机器学习模型中,训练数据和测试数据是不同的阶段,并且,通常是是假定训练数据和测试数据点遵循相同的分布。但是实际上&…...
基于SSM+VUE守护萌宠宠物网站JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...
【在Linux世界中追寻伟大的One Piece】Socket编程TCP
目录 1 -> TCP socket API 2 -> V1 -Echo Server 2.1 -> 测试多个连接的情况 1 -> TCP socket API socket(): socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符。应用程序可以像读写文件一样用r…...
进入半导体行业需要具备哪些能力?
要进入半导体公司,尤其是从事工艺流程设计和制程优化的岗位,需要具备一定的跨学科背景。 以某公司招聘要求为例: **公司 招聘岗位:工艺工程师 该公司是一家从事半导体设备、工艺与材料研发、生产和销售的公司,面向…...
Nature重磅:AI化学家再升级!大幅提升实验效率,推动化学合成进入“智能化”新阶段
人工智能(AI)驱动的机器人,正在我们的生活中扮演着越来越重要的角色,而在化学合成实验室内,它们也在悄然改变着传统实验方式。 如今,科学家们在智能化学领域取得了新突破—— 来自英国利物浦大学的研究团…...
源代码泄漏怎么办?SDC沙盒成为破局利器
在数字化时代,源代码安全已成为企业关注的焦点。源代码的泄露不仅可能导致知识产权的损失,还可能被竞争对手利用,给企业带来巨大的经济损失和法律风险。因此,采取有效的源代码防泄漏措施至关重要。深信达的SDC沙盒防泄密软件&…...
【论文复现】基于图卷积网络的轻量化推荐模型
本文所涉及所有资源均在这里可获取。 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐、摄影的一位博主。 📗本文收录于论文复现系列,大家有兴趣的可以看一看…...
使用ssh-key免密登录服务器或免密连接git代码仓库网站
ssh登录服务器场景 假设有两台机器,分别是: 源机器:主机A(hostA),ip:198.168.0.1 目标机器:主机B(hostB),ip:192.168.0.2 ssh-key免…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
