遗传算法与深度学习实战(29)——编码卷积自编码器架构

遗传算法与深度学习实战(29)——编码卷积自编码器架构

    • 0. 前言
    • 1. 构建卷积自编码器
    • 2. 构建卷积自编码器基因序列
    • 3. 解析基因序列构建模型
    • 小结
    • 系列链接

0. 前言

使用遗传算法 (Genetic Algorithm, GA) 构建自编码器 (AutoEncoder, AE) 优化器时,第一步是构建将架构编码为基因序列的模式,借鉴使用遗传算法自动优化卷积神经网络的基因构建思想,并引入 AE 的限制条件。同时,模型通过添加 BatchNormalizationDropout 来改进自编码器模型。

1. 构建卷积自编码器

(1) 导入所需库和数据集:

import numpy as np
import tensorflow as tf
import numpy as np
import randomfrom tensorflow.keras.datasets import mnist
from tensorflow.keras import layers, models, Input, Model
from tensorflow.keras.callbacks import EarlyStoppingfrom IPython import display
from IPython.display import clear_output
import matplotlib.pyplot as plt
from tensorflow.keras.utils import plot_model
plt.gray()# load dataset
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.fashion_mnist.load_data()# split dataset
train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype("float32") / 255.0
test_images = test_images.reshape(test_images.shape[0], 28, 28, 1).astype("float32") / 255.0class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']import mathdef 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, train_images, train_labels)

(2) 构建、编译并训练模型:

# input layer
input_layer = Input(shape=(28, 28, 1))# encoding architecture
encoded_layer1 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(input_layer)
encoded_layer1 = layers.MaxPool2D( (2, 2), padding='same')(encoded_layer1)
encoded_layer2 = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(encoded_layer1)
encoded_layer2 = layers.MaxPool2D( (2, 2), padding='same')(encoded_layer2)
encoded_layer3 = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(encoded_layer2)
latent_view    = layers.MaxPool2D( (2, 2), padding='same')(encoded_layer3)#decoding architecture
decoded_layer1 = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(latent_view)
decoded_layer1 = layers.UpSampling2D((2, 2))(decoded_layer1)
decoded_layer2 = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(decoded_layer1)
decoded_layer2 = layers.UpSampling2D((2, 2))(decoded_layer2)
decoded_layer3 = layers.Conv2D(64, (3, 3), activation='relu')(decoded_layer2)
decoded_layer3 = layers.UpSampling2D((2, 2))(decoded_layer3)
#output layer
output_layer   = layers.Conv2D(1, (3, 3), padding='same')(decoded_layer3)# compile the model
model = Model(input_layer, output_layer)
model.compile(optimizer='adam', loss='mse')
model.summary()
plot_model(model)history_loss = []
history_val_loss = []def add_history(history):history_loss.append(history.history["loss"])history_val_loss.append(history.history["val_loss"])def reset_history():global history_lossglobal history_val_losshistory_loss = []history_val_loss = []return []def plot_results(num_images, images, labels, history):add_history(history)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()plt.plot(history_loss, label='loss')plt.plot(history_val_loss, label='val_loss')plt.legend()
plt.show()EPOCHS = 3
history = reset_history()for i in range(EPOCHS):history = model.fit(train_images, train_images, epochs=1, batch_size=2048, validation_data=(test_images, test_images))pred_images = model.predict(test_images[:25])clear_output()
plot_results(25, pred_images[:25], test_labels[:25], history)
# input layer
input_layer = Input(shape=(28, 28, 1))# encoding architecture
x = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(input_layer)
#x = layers.BatchNormalization()(x)
x = layers.MaxPool2D( (2, 2), padding='same')(x)
#x = layers.Dropout(0.5)(x)
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(x)
#x = layers.BatchNormalization()(x)
x = layers.MaxPool2D( (2, 2), padding='same')(x)
#x = layers.Dropout(0.5)(x)
x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(x)
#x = layers.BatchNormalization()(x)
x = layers.MaxPool2D( (2, 2), padding='same')(x)
#x = layers.Dropout(0.5)(x)#decoding architecture
x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(x)
#x = layers.Dropout(0.5)(x)
x = layers.UpSampling2D((2, 2))(x)
#x = layers.BatchNormalization()(x)
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(x)
#x = layers.Dropout(0.5)(x)
x = layers.UpSampling2D((2, 2))(x)
#x = layers.BatchNormalization()(x)
x = layers.Conv2D(64, (3, 3), activation='relu')(x)
#x = layers.Dropout(0.5)(x)
x = layers.UpSampling2D((2, 2))(x)
#x = layers.BatchNormalization()(x)
#output layer
output_layer   = layers.Conv2D(1, (3, 3), padding='same')(x)# compile the model
model = Model(input_layer, output_layer)
model.compile(optimizer='adam', loss='mse')
model.summary()
plot_model(model)EPOCHS = 10
history = reset_history()for i in range(EPOCHS):history = model.fit(train_images, train_images, epochs=1, batch_size=2048, validation_data=(test_images, test_images))pred_images = model.predict(test_images[:25])clear_output()
plot_results(25, pred_images[:25], test_labels[:25], history)

2. 构建卷积自编码器基因序列

在基因序列的编码模式考虑卷积/最大池化层和上采样/卷积层,表示编码器卷积层的编码标记定义为 CONV_LAYER,表示解码器的上采样/卷积层的标记定义为 UPCONV_LAYER

(1) 接下来,生成编码器层 (CONV_LAYER) 和解码器层 (UPCONV_LAYER):

max_layers = 10
max_neurons = 128
min_neurons = 16
max_kernel = 3
min_kernel = 3
max_pool = 2
min_pool = 2CONV_LAYER = -1
CONV_LAYER_LEN = 4
BN_LAYER = -3
BN_LAYER_LEN = 1
DROPOUT_LAYER = -4
DROPOUT_LAYER_LEN = 2
UPCONV_LAYER = -2
UPCONV_LAYER_LEN = 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_conv_layer():part = [CONV_LAYER] part.append(generate_neurons())part.extend(generate_kernel())  return partdef generate_upconv_layer():part = [UPCONV_LAYER] part.append(generate_neurons())part.extend(generate_kernel())  return part
编写函数在模型中添加BatchNormalization和dropout。
def generate_bn_layer():part = [BN_LAYER] return partdef generate_dropout_layer():part = [DROPOUT_LAYER] part.append(random.uniform(0,.5))  return part

(2) 实现 create_offspring() 函数创建基因序列,函数分为两个循环:一个用于编码器部分,另一个用于解码器部分。编码器部分遍历网络层,并随机检查是否应该添加另一个卷积层,如果添加了一个卷积层,则继续随机检查是否应该添加批归一化层或 dropout 层。并自动添加了一个最大池化层,以实现自编码器的降维架构:

def create_offspring():ind = []layers = 0for i in range(max_layers):if i==0: #first layer always convolutationalind.extend(generate_conv_layer())      layers += 1elif random.uniform(0,1)<.5:#add convolution layerind.extend(generate_conv_layer())layers += 1if random.uniform(0,1)<.5:#add batchnormalizationind.extend(generate_bn_layer())if random.uniform(0,1) < .5:ind.extend(generate_dropout_layer()) for i in range(layers):ind.extend(generate_upconv_layer())if random.uniform(0,1)<.5:#add batchnormalizationind.extend(generate_bn_layer())if random.uniform(0,1) < .5:ind.extend(generate_dropout_layer())return indindividual = create_offspring()
print(individual)

解码器部分是编码器的镜像。因此,通过与编码器相同的迭代次数进行循环,添加上采样和卷积层组合。之后,以应用概率检查添加 BatchNormalizationDropout 层。

3. 解析基因序列构建模型

(1) 接下来,通过解析基因序列构建模型。首先循环遍历每个基因,并检查它是否与一个网络层标记匹配。如果匹配,则将相应的层和选项添加到模型中。对于编码器卷积层 (CONV_LAYER),如果输入形状大于 (7, 7),添加一个最大池化层,用于确保模型保持降维架构:

def padding(gene):return "same" if gene == 1 else "valid"def build_model(individual):input_layer = Input(shape=(28, 28, 1))  il = len(individual)i = 0x = input_layerwhile i < il:    if individual[i] == CONV_LAYER:      pad="same" n = individual[i+1]k = (individual[i+2], individual[i+3])i += CONV_LAYER_LEN        x = layers.Conv2D(n, k, activation='relu', padding=pad)(x) if x.shape[1] > 7:x = layers.MaxPool2D( (2, 2), padding='same')(x)

(2) 继续检查标记添加网络层,对于 UPCONV_LAYER 解码器层,检查模型输出是否与输入大小相同:

        elif individual[i] == BN_LAYER: #add batchnormal layerx = layers.BatchNormalization()(x)i += BN_LAYER_LEN      elif individual[i] == DROPOUT_LAYER: #add dropout layer            x = layers.Dropout(individual[i+1])(x) i += DROPOUT_LAYER_LENelif individual[i] == UPCONV_LAYER:pad="same"n = individual[i+1]k = (individual[i+2], individual[i+3])        x = layers.Conv2D(n, k, activation='relu', padding=pad)(x)   x = layers.UpSampling2D((2, 2))(x)   i += CONV_LAYER_LEN   if x.shape[1] == (28):break #model is completeelse:break

build_model() 函数构建、编译模型并返回模型。在返回之前,通过检查最后一个解码器层的形状来确认模型输出,如果输出尺寸较小,通过添加一个上采样层,将输出大小从 (14, 14) 加倍到 (28, 28)

为了测试 build_model() 函数,创建 100 个随机后代,并评估模型的大小。生成随机的个体基因序列,然后根据这些序列构建相应的模型。在此过程中,跟踪生成的最小和最大模型:

    if x.shape[1] == 14:x = layers.UpSampling2D((2, 2))(x)output_layer = layers.Conv2D(1, (3, 3), padding='same')(x)model = Model(input_layer, output_layer)model.compile(optimizer='adam', loss='mse')return modelmodel = build_model(individual) 
model.summary()

(3) 使用最小参数模型进行 10epochs 的训练,输出如下图所示:

max_model = None
min_model = None
maxp = 0
minp = 10000000for i in range(100):individual = create_offspring() model = build_model(individual)p = model.count_params() if p > maxp:maxp = pmax_model = modelif p < minp:minp = pmin_model = model max_model.summary(line_length=100)
min_model.summary(line_length=100)EPOCHS = 10
history = reset_history()#model = max_model
model = min_modelfor i in range(EPOCHS):history = model.fit(train_images, train_images, epochs=1, batch_size=2048, validation_data=(test_images, test_images))pred_images = model.predict(test_images[:25])clear_output()plot_results(25, pred_images[:25], test_labels[:25], history)

运行结果

可以看到,使用 create_offspring()build_model() 随机生成的模型比我们手动优化的自编码器更好,这表明了使用遗传算法优化自编码器模型的有效性。
同样,我们可以测试最大参数模型。可以通过完成以下问题进一步了解网络架构编码:

  • 调用 create_offspring() 函数创建个体列表,打印并比较不同模型
  • 将概率从 0.5 修改为其他值,观察对生成的模型有什么影响

小结

使用卷积层的复杂自编码器可能较难构建,可以使用神经进化构建定义编码器和解码器部分的分层架构。在编码器和解码器中使用卷积层需要额外的上采样层和匹配的层配置,这些配置可以编码成自定义的遗传序列。

系列链接

遗传算法与深度学习实战(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)——编码卷积神经网络架构
遗传算法与深度学习实战(27)——进化卷积神经网络
遗传算法与深度学习实战(28)——卷积自编码器详解与实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498064.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯(Java)(ing)

Java前置知识 输入流&#xff1a; &#xff08;在Java面向对象编程里面有提过相关知识&#xff09; // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new OutputStreamWriter…

Ajax数据爬取

有时我们用requests 抓取页面得到的结果&#xff0c;可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据&#xff0c;而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档&#xff0c;而浏览器中的页面是JavaScript 处理…

tcpdump 网络数据包分析工具

简介 用简单的话来定义tcpdump&#xff0c;就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的…

手机发烫怎么解决?

在当今这个智能手机不离手的时代&#xff0c;手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感&#xff0c;长期过热还可能损害手机硬件、缩短电池寿命&#xff0c;甚至引发安全隐患。不过别担心&#xff0c;下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…

BUUCTF Pwn ciscn_2019_es_2 WP

1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数&#xff1a; 看看vul函数&#xff1a; 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造 所以使用栈迁移&#xff1a; 栈迁移需要用到leave ret 使用ROPgadget找地址&#xff1a; …

IEDA 使用auto Dev编码助手配置Deep Seek V3

文章目录 API Key的申请和创建auto Dev的下载auto Dev的安装Deep seek V3的连接配置和注意事项错误解决&#xff1a;You LLM server Key is empty API Key的申请和创建 登陆Deep Seek开放平台&#xff0c;创建API Key 并复制 auto Dev的下载 auto Dev项目地址&#xff0c;发…

vue3学习笔记(6)-生命周期、hooks

1.生命周期 <template><div><div>{{ a }}</div><div click"test"></div></div> </template> <script setup lang"ts" name"hi"> import { ref, onBeforeMount, onMounted, onBeforeUpdat…

#端云一体化开发# #HarmonyOS Next#《说书人》鸿蒙原生基于角色的对话式文本编辑开发方案

1、写在前面 过去的一百年里&#xff0c;在“编程”的这个行业诞生之初&#xff0c;人们采用面向过程的方式进行开发&#xff0c;但是&#xff0c;伴随着程序规模的日益增大&#xff0c;程序的复杂度也随之增加&#xff0c;使用结构化编程方法来管理复杂的程序逻辑变得越来越困…

【ELK】ES单节点升级为集群模式--太细了!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言准备工作1. 查看现状【单节点】2. 原节点改集群模式3. 改es配置文件&#xff0c;增加集群相关配置项4. *改docker映射的端口* 启动新节点5. docker-compose起一…

Python跨年烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

未来网络技术的新征程:5G、物联网与边缘计算(10/10)

一、5G 网络&#xff1a;引领未来通信新潮流 &#xff08;一&#xff09;5G 网络的特点 高速率&#xff1a;5G 依托良好技术架构&#xff0c;提供更高的网络速度&#xff0c;峰值要求不低于 20Gb/s&#xff0c;下载速度最高达 10Gbps。相比 4G 网络&#xff0c;5G 的基站速度…

艾体宝方案丨全面提升API安全:AccuKnox 接口漏洞预防与修复

一、API 安全&#xff1a;现代企业的必修课 在现代技术生态中&#xff0c;应用程序编程接口&#xff08;API&#xff09;扮演着不可或缺的角色。从数据共享到跨平台集成&#xff0c;API 成为连接企业系统与外部服务的桥梁。然而&#xff0c;伴随云计算的普及与微服务架构的流行…

# 【鸿蒙开发】多线程之Worker的使用

【鸿蒙开发】多线程之Worker的使用 文章目录 【鸿蒙开发】多线程之Worker的使用前言一、Worker的介绍二、注意事项三、Worker使用示例1.新建一个Worker2.主线程使用Worker3.子线程Worker的使用 四、效果展示 前言 本文主要介绍了多线程的方法之一&#xff0c;使用Worker开启多…

leetcode 面试经典 150 题:矩阵置零

链接矩阵置零题序号73题型二维数组解题方法标记数组法难度中等熟练度✅✅✅✅ 题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1]…

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践&#xff1a;Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致&#xff0c;并确保团队拥有交付出色工作所需的资源。在过去几年中&#xff0c;由于分布式团队的需求不断增加&#xff0c;项目经理这一角色已迅速…

MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】

1.打开MySQL的官网&#xff0c;选择下载(Download) MySQL[这里是图片001]https://www.mysql.com/cn/ 2.往下划点击MySQL Community(GPL)Downloads 3.要下载MySQL的jar包的选择Connector/J 4.进入后&#xff0c;根据自己的需求选择相应的版本 5.下载完成后&#xff0c;进行解压…

WPF 绘制过顶点的圆滑曲线 (样条,贝塞尔)

在一个WPF项目中要用到样条曲线&#xff0c;必须过顶点&#xff0c;圆滑后还不能太走样&#xff0c;捣鼓一番&#xff0c;发现里面颇有玄机&#xff0c;于是把我多方抄来改造的方法发出来&#xff0c;方便新手&#xff1a; 如上图&#xff0c;看代码吧&#xff1a; ----------…

北京某新能源汽车生产及办公网络综合监控项目

北京某新能源汽车是某世界500强汽车集团旗下的新能源公司&#xff0c;也是国内首个获得新能源汽车生产资质、首家进行混合所有制改造、首批践行国有控股企业员工持股的新能源汽车企业&#xff0c;其主营业务包括纯电动乘用车研发设计、生产制造与销售服务。 项目现状 在企业全…

【阅读笔记】《基于区间梯度的联合双边滤波图像纹理去除方法》

一、联合双边滤波背景 联合双边滤波&#xff08;Joint Bilateral Filter, JBF&#xff09;是一种图像处理技术&#xff0c;它在传统的双边滤波&#xff08;Bilateral Filter, BF&#xff09;基础上进行了改进&#xff0c;通过引入一个引导图&#xff08;guidance image&#x…

VIM: Vision Mamba基于双向状态空间模型的高效视觉表示学习

这篇文章的主要内容可以概括如下&#xff1a; 背景与动机&#xff1a; 近年来&#xff0c;状态空间模型&#xff08;SSM&#xff09;在长序列建模中展现出巨大潜力&#xff0c;尤其是Mamba模型在硬件感知设计上的高效性。 然而&#xff0c;现有的SSM模型在处理视觉数据时面临…