当前位置: 首页 > news >正文

遗传算法与深度学习实战(26)——编码卷积神经网络架构

遗传算法与深度学习实战(26)——编码卷积神经网络架构

    • 0. 前言
    • 1. EvoCNN 原理
      • 1.1 工作原理
      • 1.2 基因编码
    • 2. 编码卷积神经网络架构
    • 小结
    • 系列链接

0. 前言

我们已经学习了如何构建卷积神经网络 (Convolutional Neural Network, CNN),在本节中,我们将了解如何将 CNN 模型的网络架构编码为基因,这是将基因序列进化在为给定数据集上训练最佳模型的先决条件。

1. EvoCNN 原理

进化卷积神经网络 (Evolutionary Convolutional Neural Network, EvoCNN) 是一种结合了进化算法和卷积神经网络的方法。
我们知道进化算法是一类基于生物进化过程中的选择、变异和竞争机制的优化算法。在进化卷积神经网络中,进化算法用来优化卷积神经网络 (Convolutional Neural Network, CNN) 的结构或超参数,以提升其性能和适应特定任务的能力。

1.1 工作原理

EvoCNN 可以利用进化算法来自动设计 CNN 的网络结构,包括卷积层的数量、每层的卷积核大小、池化操作的类型等。自动设计的过程可以帮助避免人工设计网络结构时的主观偏差,并且可以根据具体任务调整网络结构。
除了网络结构外,进化算法还可以用于优化 CNN 的超参数,如学习率、批处理大小等,以提升训练效率和模型性能。
EvoCNN 的另一个优点是其适应性强,能够适应不同的任务和数据集。通过进化算法,网络可以在训练过程中动态调整,以适应变化的输入数据和任务要求。

1.2 基因编码

EvoCNN 是演化 CNN 模型架构的模型,其定义了一种将卷积网络编码为可变长度基因序列的过程,如下图所示。

EvoCNN

2. 编码卷积神经网络架构

(1) 首先,导入所需库,并加载数据集:

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import numpy as np
import math
import time
import randomimport matplotlib.pyplot as plt
from livelossplot import PlotLossesKerasdataset = datasets.fashion_mnist
(x_train, y_train), (x_test, y_test) = dataset.load_data()# normalize and reshape data
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1).astype("float32") / 255.0
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1).astype("float32") / 255.0x_train = x_train[:1000]
y_train= y_train[:1000]
x_test = x_test[:100]
y_test= y_test[:100]class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']def plot_data(num_images, images, labels):grid = math.ceil(math.sqrt(num_images))plt.figure(figsize=(grid*2,grid*2))for i in range(num_images):plt.subplot(grid,grid,i+1)plt.xticks([])plt.yticks([])plt.grid(False)     plt.imshow(images[i].reshape(28,28))plt.xlabel(class_names[labels[i]])      plt.show()plot_data(25, x_train, y_train)

构建基因序列时,我们希望定义一个基本规则,所有模型都以卷积层开始,并以全连接层作为输出层结束。为了简化问题,我们无需编码最后的输出层。

(2) 在每个主要网络层内部,我们还需要定义相应的超参数选项,例如滤波器数量和卷积核大小。为了编码多样化数据,我们需要分离主要网络层和相关超参数。设置常量用于定义网络层类型和长度以封装各种相关的超参数。定义总最大网络层数和各种网络层超参数的范围,之后,定义每种类型的块标识符及其相应的大小(该值表示每个层定义的长度,包括超参数):

max_layers = 5
max_neurons = 128
min_neurons = 16
max_kernel = 5
min_kernel = 2
max_pool = 3
min_pool = 2CONV_LAYER = -1
CONV_LAYER_LEN = 4
POOLING_LAYER = -2
POOLING_LAYER_LEN = 3
BN_LAYER = -3
BN_LAYER_LEN = 1
DENSE_LAYER = -4
DENSE_LAYER_LEN = 2

下图展示了编码层块及其相应超参数的基因序列。需要注意的是,负值 -1-2-3-4 表示网络层的开始。然后,根据层类型,进一步定义滤波器数量和卷积核大小等超参数。

编码过程

(3) 构建个体的基因序列(染色体),create_offspring() 函数是构建序列的基础。此代码循环遍历最大层数次,并检查是否(以 50% 的概率)添加卷积层。如果是,则进一步检查是否(以 50% 的概率)添加批归一化和池化层:

def create_offspring():ind = []for i in range(max_layers):if random.uniform(0,1)<.5:#add convolution layerind.extend(generate_conv_layer())if random.uniform(0,1)<.5:#add batchnormalizationind.extend(generate_bn_layer())if random.uniform(0,1)<.5:#add max pooling layerind.extend(generate_pooling_layer())ind.extend(generate_dense_layer())return ind

(4) 编写用于构建网络层的辅助函数:

def generate_neurons():return random.randint(min_neurons, max_neurons)def generate_kernel():part = []part.append(random.randint(min_kernel, max_kernel))part.append(random.randint(min_kernel, max_kernel))return partdef generate_bn_layer():part = [BN_LAYER] return partdef generate_pooling_layer():part = [POOLING_LAYER] part.append(random.randint(min_pool, max_pool))part.append(random.randint(min_pool, max_pool))return partdef generate_dense_layer():part = [DENSE_LAYER] part.append(generate_neurons())  return partdef generate_conv_layer():part = [CONV_LAYER] part.append(generate_neurons())part.extend(generate_kernel())return part

(5) 调用 create_offspring() 生成基因序列,输出如下所示。可以多次调用该函数,观察创建的基因序列的变化:

individual = create_offspring()
print(individual)
# [-1, 37, 5, 2, -3, -1, 112, 4, 2, -4, 25]

(6) 获取基因序列后,继续构建模型,解析基因序列并创建 Keras 模型。build_model 的输入是单个基因序列,利用基因序列产生 Keras 模型。定义网络层之后,根据网络层类型添加超参数:

def build_model(individual):model = models.Sequential()il = len(individual)i = 0while i < il:if individual[i] == CONV_LAYER: n = individual[i+1]k = (individual[i+2], individual[i+3])i += CONV_LAYER_LENif i == 0: #first layer, add input shape      model.add(layers.Conv2D(n, k, activation='relu', padding="same", input_shape=(28, 28, 1)))      else:model.add(layers.Conv2D(n, k, activation='relu', padding="same"))    elif individual[i] == POOLING_LAYER: #add pooling layerk = k = (individual[i+1], individual[i+2])i += POOLING_LAYER_LENmodel.add(layers.MaxPooling2D(k, padding="same"))      elif individual[i] == BN_LAYER: #add batch normal layermodel.add(layers.BatchNormalization())i += 1      elif individual[i] == DENSE_LAYER: #add dense layermodel.add(layers.Flatten())      model.add(layers.Dense(individual[i+1], activation='relu'))i += 2model.add(layers.Dense(10))return modelmodel = build_model(individual)

(7) 创建一个新的个体基因序列,根据序列构建一个模型,然后训练模型,输出训练/验证过程中模型性能:

individual = create_offspring()model = build_model(individual) model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])history = model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test),callbacks=[PlotLossesKeras()],verbose=0)model.summary()
model.evaluate(x_test, y_test)

模型性能的优略取决于随机初始序列,多次运行代码,以观察不同初始随机个体之间的差异。可以通过完成以下问题进一步了解网络架构编码:

  • 通过调用循环中的 create_offspring 函数,创建一个新的基因编码序列列表,打印并比较不同个体
  • 修改最大/最小范围超参数,然后生成一个新的后代列表
  • 添加一个新输入到 create_offspring 函数,将概率从 0.5 更改为其他值。然后,生成一个后代列表进行比较

小结

进化卷积神经网络 (Evolutionary Convolutional Neural Network, EvoCNN) 通过结合进化算法的优势,提供了一种自动化设计和优化深度学习模型的方法。在本节中,我们介绍了如何将卷积神经网络架构编码为基因序列,为构建进化卷积神经网络奠定基础。

系列链接

遗传算法与深度学习实战(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构建神经网络
遗传算法与深度学习实战(23)——利用遗传算法优化深度学习模型
遗传算法与深度学习实战(24)——在Keras中应用神经进化优化
遗传算法与深度学习实战(25)——使用Keras构建卷积神经网络

相关文章:

遗传算法与深度学习实战(26)——编码卷积神经网络架构

遗传算法与深度学习实战&#xff08;26&#xff09;——编码卷积神经网络架构 0. 前言1. EvoCNN 原理1.1 工作原理1.2 基因编码 2. 编码卷积神经网络架构小结系列链接 0. 前言 我们已经学习了如何构建卷积神经网络 (Convolutional Neural Network, CNN)&#xff0c;在本节中&a…...

Linux无线网络配置工具:iwconfig vs iw

在Linux系统中&#xff0c;无线网络配置和管理是网络管理员和开发者的常见任务。本文将详细介绍两个常用的无线网络配置命令行工具&#xff1a;iwconfig 和 iw&#xff0c;并对比它们之间的区别&#xff0c;帮助您更好地选择合适的工具进行无线网络配置。 一、iwconfig 简介 …...

RabbitMQ介绍及安装

文章目录 一. MQ二. RabbitMQ三. RabbitMQ作用四. MQ产品对比五. 安装RabbitMQ1. 安装erlang2. 安装rabbitMQ3. 安装RabbitMQ管理界⾯4. 启动服务5. 访问界面6. 添加管理员用户7. 重新登录 一. MQ MQ( Message queue ), 从字⾯意思上看, 本质是个队列, FIFO 先⼊先出&#xff…...

借助 AI 工具,共享旅游-卡-项目助力年底增收攻略

年底了&#xff0c;大量的商家都在开始筹备搞活动&#xff0c;接下来的双十二、元旦、春节、开门红、寒假&#xff0c;各种活动&#xff0c;目的就是为了拉动新客户。 距离过年还有56 天&#xff0c;如何破局&#xff1f; 1、销售渠道 针对旅游卡项目&#xff0c;主要销售渠道…...

Docker Compose 和 Kubernetes 之间的区别?

一、简介&#x1f380; 1.1 Docker Compose Docker Compose 是 Docker 官方的开源项目&#xff0c;负责实现对 Docker 容器集群的快速编排&#xff0c;可以管理多个 Docker 容器组成一个应用。你只需定义一个 YAML 格式的配置文件 docker-compose.yml &#xff0c;即可创建并…...

node.js常用的模块和中间件?

‌Node.js常用的模块和中间件包括以下几种‌&#xff1a; ‌Express‌&#xff1a;Express是一个灵活的Node.js web应用框架&#xff0c;提供了丰富的API来处理HTTP请求和响应。它支持中间件系统&#xff0c;可以轻松地添加各种功能&#xff0c;如路由、模板引擎、静态文件服务…...

Llama模型分布式训练(微调)

1 常见大模型 1.1 参数量对照表 模型参数量发布时间训练的显存需求VGG-19143.68M2014~5 GB&#xff08;单 224x224 图像&#xff0c;batch_size32&#xff09;ResNet-15260.19M2015~7 GB&#xff08;单 224x224 图像&#xff0c;batch_size32&#xff09;GPT-2 117M117M2019~…...

Matlab模块From Workspace使用数据类型说明

Matlab原文连接&#xff1a;Load Data Using the From Workspace Block 模型&#xff1a; 从信号来源的数据&#xff1a; timeseries 数据&#xff1a; sampleTime 0.01; numSteps 1001;time sampleTime*[0:(numSteps-1)]; time time;data sin(2*pi/3*time);simin time…...

LangChain学习笔记(一)-LangChain简介

LangChain学习笔记&#xff08;一&#xff09;-LangChain简介 langChain是一个人工智能大语言模型的开发框架&#xff0c;主要构成为下图。 ​ ​ 一、核心模块 &#xff08;一&#xff09;模型I/O模块 负责与现有大模型进行交互&#xff0c;由三部分组成&#xff1a; 提…...

k8s,声明式API对象理解

命令式API 比如&#xff1a; 先kubectl create&#xff0c;再replace的操作&#xff0c;我们称为命令式配置文件操作 kubectl replace的执行过程&#xff0c;是使用新的YAML文件中的API对象&#xff0c;替换原有的API对象&#xff1b;而kubectl apply&#xff0c;则是执行了一…...

KubeBlocks v0.9.2发布啦!支持容器镜像滚动更新、MySQL支持Jemalloc...快来升级体验更多新功能!

KubeBlocks v0.9.2 正式发布啦&#xff01;本次发布包含了一些新功能、关键的错误修复以及各种改进。以下是详细的更新内容。 升级文档 v0.9.2 升级方式与 v0.9.1 相同&#xff0c;替换版本即可哦&#xff5e; https://kubeblocks.io/docs/release-0.9/user_docs/upgrade/up…...

Linux-虚拟环境

文章目录 一. 虚拟机二. 虚拟化软件三. VMware WorkStation四. 安装CentOS操作系统五. 在VMware中导入CentOS虚拟机六. 远程连接Linux系统1. Finalshell安装2. 虚拟机网络配置3. 连接到Linux系统 七. 虚拟机快照 一. 虚拟机 借助虚拟化技术&#xff0c;我们可以在系统中&#…...

window系统下的git怎么在黑窗口配置代理

在Windows系统下&#xff0c;通过黑窗口&#xff08;命令行界面&#xff09;配置Git代理主要有两种方式&#xff1a;配置HTTP代理和配置SOCKS5代理。以下是具体的步骤&#xff1a; 配置HTTP代理 临时代理设置&#xff08;仅对当前命令行会话有效&#xff09;&#xff1a; set …...

网络和通信详解

一、Java 网络编程基础 IP 地址和端口号 IP 地址&#xff1a; IP 地址是互联网协议地址&#xff0c;用于标识网络中的设备。在 Java 中&#xff0c;InetAddress类是用于表示 IP 地址的主要类。例如&#xff0c;InetAddress.getByName("www.example.com")可以获取指定…...

网络安全框架及模型-PPDR模型

网络安全框架及模型-PPDR模型 概述: 为了有效应对不断变化的网络安全环境,人们意识到需要一种综合性的方法来管理和保护网络安全。因此,PPDR模型应运而生。它将策略、防护、检测和响应四个要素结合起来,提供了一个全面的框架来处理网络安全问题。 工作原理: PPDR模型的…...

WPF+LibVLC开发播放器-LibVLC播放控制

接上一篇&#xff1a; LibVLC在C#中的使用 实现LibVLC播放器播放控制 界面 界面上添加一个Button按钮用于控制播放 <ButtonGrid.Row"1"Width"88"Height"24"Margin"10,0,0,0"HorizontalAlignment"Left"VerticalAlignme…...

子模块、Fork、NPM 包与脚手架概述

子模块 在 Git 仓库中嵌套另一个仓库&#xff0c;通过引用的方式引入到主项目&#xff0c;版本管理依赖 Git 提交记录或分支&#xff0c;更新需手动拉取并提交&#xff0c;适用于共享代码并保持项目独立性。 优点&#xff1a;子模块支持直接查看和修改&#xff0c;保持子模块…...

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…...

【el-table】表格后端排序

在需要排序的列添加属性 sortable&#xff0c;后端排序&#xff0c;需将sortable设置为custom 如果需要自定义轮转添加 sort-orders 属性&#xff0c;数组中的元素需为以下三者之一&#xff1a;ascending 表示升序&#xff0c;descending 表示降序&#xff0c;null 表示还原为原…...

APP聊天项目介绍

项目结构说明 res/layout目录&#xff1a;存放布局相关的 XML 文件&#xff0c;用于定义界面的外观&#xff0c;包含activity_main.xml&#xff08;主界面布局&#xff09;和message_item.xml&#xff08;聊天消息项布局&#xff09;。 res/drawable目录&#xff1a;存放一些…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...