文章目录

  • 神经网络部分
  • 遗传算法优化部分
  • 结果部分

话不多说,直接上代码

神经网络部分

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: liujie
@software: PyCharm
@file: main.py
@time: 2020/11/17 20:46
"""
'''整体思路:1.首先,写一个main.py文件进行神经网络的训练及测试过程2.将main.py中需要优化的参数(这里我们优化LSTM层数和全连接层数及每层神经元的个数)统一写到一个列表num中3.然后,遗传算法编写GA.py,用需要传入main.py文件的列表num当染色体,需要优化的参数是染色体上的基因main.py文件中,由于需要将所有优化的参数写到一个列表中,所以需要在文件中定义两个函数,分别是创建LSTM函数creat_lstm(inputs,units,return_sequences)创建全连接层函数creat_dense(inputs,units)
'''import numpy as np
import tensorflow as tf
import pandas as pd
import matplotlib.pylab as pltfrom tensorflow import keras
from tensorflow.keras.layers import LSTM, Dense, Dropout, BatchNormalization, Input
from tensorflow.keras import optimizers, losses, metrics, models# 定义LSTM函数
def create_lstm(inputs, units, return_sequences):'''定义LSTM函数:param inputs:输入,如果这一层是第一层LSTM层,则传入layers.Input()的变量名,否则传入的是上一个LSTM层:param units: LSTM层的神经元:param return_sequences: 如果不是最后一层LSTM,都需要保留所有输出以传入下一LSTM层:return:'''lstm = LSTM(units, return_sequences=return_sequences)(inputs)print('LSTM: ', lstm.shape)return lstmdef create_dense(inputs, units):'''定义Dense层函数:param inputs:输入,如果这一连接层是第一层全连接层,则需传入layers.Flatten()的变量名:param units: 全连接层单元数:return: 全连接层,BN层,dropout层'''# dense层dense = Dense(units, kernel_regularizer=keras.regularizers.l2(0.001), activation='relu')(inputs)print('Dense:', dense.shape)# dropout层dense_dropout = Dropout(rate=0.2)(dense)dense_batch = BatchNormalization()(dense_dropout)return dense, dense_dropout, dense_batchdef load():'''数据集加载:return:'''(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()# 数据集归一化x_train, x_test = x_train / 255.0, x_test / 255.0return x_train, y_train, x_test, y_testdef classify(x_train, y_train, x_test, y_test, num):'''利用num及上面定义的层,构建模型:param x_train::param y_train::param x_test::param y_test::param num: 需要优化的参数(LSTM和全连接层层数以及每层神经元的个数),同时,也是遗传算法中的染色体:return:'''# 设置LSTM层参数lstm_num_layers = num[0]lstm_units = num[2:2 + lstm_num_layers]lstm_name = list(np.zeros((lstm_num_layers,)))# 设置LSTM_Dense层的参数lstm_dense_num_layers = num[1]lstm_dense_units = num[2 + lstm_num_layers: 2 + lstm_num_layers + lstm_dense_num_layers]lstm_dense_name = list(np.zeros((lstm_dense_num_layers,)))lstm_dense_dropout_name = list(np.zeros((lstm_dense_num_layers,)))lstm_dense_batch_name = list(np.zeros((lstm_dense_num_layers,)))inputs_lstm = Input(shape=(x_train.shape[1], x_train.shape[2]))for i in range(lstm_num_layers):if i == 0:inputs = inputs_lstmelse:inputs = lstm_name[i - 1]if i == lstm_num_layers - 1:return_sequences = Falseelse:return_sequences = Truelstm_name[i] = create_lstm(inputs, lstm_units[i], return_sequences=return_sequences)for i in range(lstm_dense_num_layers):if i == 0:inputs = lstm_name[lstm_num_layers - 1]else:inputs = lstm_dense_name[i - 1]lstm_dense_name[i], lstm_dense_dropout_name[i], lstm_dense_batch_name[i] = create_dense(inputs,units=lstm_dense_units[i])outputs_lstm = Dense(10, activation='softmax')(lstm_dense_batch_name[lstm_dense_num_layers - 1])# 构建模型LSTM_model = keras.Model(inputs=inputs_lstm, outputs=outputs_lstm)# 编译模型LSTM_model.compile(optimizer=optimizers.Adam(),loss='sparse_categorical_crossentropy',metrics=['accuracy'])history = LSTM_model.fit(x_train, y_train,batch_size=32, epochs=1, validation_split=0.1, verbose=1)# 验证模型results = LSTM_model.evaluate(x_test, y_test, verbose=0)return results[1]  # 返回测试集的准确率

遗传算法优化部分

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: liujie
@software: PyCharm
@file: GA.py
@time: 2020/11/17 22:28
"""
'''在优化神经网络上,用常规的遗传算法不易实现原因如下:1.传统的遗传算法中每条染色体的长度相同,但是优化LSTM网络时染色体的长度会因为层数的不同而不同比如:a染色体有一层LSTM层和一层全连接层,则这个染色体上共有6个基因(两个代表层数,两个代表神经元个数)b染色体有二层LSTM层和二层全连接层,则这个染色体上共有6个基因(两个代表层数,四个代表每层的神经元个数)2.在传统的遗传算法中,染色体上的基因的取值范围是相同的,但是在优化LSTM网络时,需要让表示层数的基因在一个范围内,表示神经元个数的基因在另一个范围内,比如层数范围是一到三层,神经元个数是32到256个之间3.由于染色体长度不同,交叉函数、变异函数均需要做出修改解决办法:1.将每条染色体设置为相同的长度(本题来说,因为LSTM层与全连接层层数最多三层,加上最前面两个表示层数的基因,故每条染色体上有3+3+2 = 8个基因),达不到长度要求的后面补零2.先设置前面两个基因,令其范围分别在一到三之间,然后根据这两个基因确定后面关于每层神经元个数的基因3.对于交叉函数的修改,首先确定取出的两条染色体(设为a染色体和b染色体)上需要交换的位置,然后遍历两条染色体在这些位置的基因,如果任一染色体上此位置上的基因为0或要交换的基因是关于层数的,则取消此位置的交换4.对于变异函数的修改,只有关于神经元个数的基因变异,关于层数的基因不变异
'''import numpy as np
import main as project
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'# 设置参数
DNA_size = 2
DNA_size_max = 8    # 每条染色体的长度
POP_size = 20       # 种群数量
CROSS_RATE = 0.5    # 交叉率
MUTATION_RATE = 0.01# 变异率
N_GENERATIONS = 40  # 迭代次数x_train,y_train,x_test,y_test = project.load()# 适应度
def get_fitness(x):return project.classify(x_train,y_train,x_test,y_test,num=x)# 生成新的种群
def select(pop,fitness):idx = np.random.choice(np.arange(POP_size),size=POP_size,replace=True,p=fitness/fitness.sum())return pop[idx]# 交叉函数
def crossover(parent,pop):if np.random.rand() < CROSS_RATE:i_ = np.random.randint(0,POP_size,size=1)   # 染色体的序号cross_points = np.random.randint(0,2,size=DNA_size_max).astype(np.bool)     # 用True、False表示是否置换# 对此位置上基因为0或是要交换的基因是关于层数的,则取消置换for i,point in enumerate(cross_points):if point == True and pop[i_,i] * parent[i] == 0:cross_points[i] = False# 修改关于层数的if point == True and i < 2:cross_points[i] = False# 将第i_条染色体上对应位置的基因置换到parent染色体上parent[cross_points] = pop[i_,cross_points]return parent# 定义变异函数
def mutate(child):for point in range(DNA_size_max):if np.random.rand() < MUTATION_RATE:if point >= 3:if child[point] != 0:child[point] = np.random.randint(32,257)return child# 层数
pop_layers = np.zeros((POP_size,DNA_size),np.int32)
pop_layers[:,0] = np.random.randint(1,4,size=(POP_size,))
pop_layers[:,1] = np.random.randint(1,4,size=(POP_size,))# 种群
pop = np.zeros((POP_size,DNA_size_max))
# 神经元个数
for i in range(POP_size):pop_neurons = np.random.randint(32,257,size=(pop_layers[i].sum(),))pop_stack = np.hstack((pop_layers[i],pop_neurons))for j,gene in enumerate(pop_stack):pop[i][j] = gene# 迭代次数
for each_generation in range(N_GENERATIONS):# 适应度fitness = np.zeros([POP_size,])# 第i个染色体for i in range(POP_size):pop_list = list(pop[i])# 第i个染色体上的基因# 将0去掉并变整数for j,each in enumerate(pop_list):if each == 0.0:index = jpop_list = pop_list[:j]for k,each in enumerate(pop_list):each_int = int(each)pop_list[k] = each_intfitness[i] = get_fitness(pop_list)print('第%d代第%d个染色体的适应度为%f'%(each_generation+1,i+1,fitness[i]))print('此染色体为:',pop_list)print('Generation:',each_generation+1,'Most fitted DNA:',pop[np.argmax(fitness),:],'适应度为:',fitness[np.argmax(fitness)])# 生成新的种群pop = select(pop,fitness)# 新的种群pop_copy = pop.copy()for i,parent in enumerate(pop):child = crossover(parent,pop_copy)child = mutate(child)pop[i] = child

结果部分

代码能跑通,自己试一下

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论留言!


遗传优化算法优化LSTM结构-准确率相关推荐

  1. Python实现GWO智能灰狼优化算法优化支持向量机分类模型(SVC算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 灰狼优化算法(GWO),由澳大利亚格里菲斯大学学者 Mirjal ...

  2. Python实现GWO智能灰狼优化算法优化支持向量机回归模型(svr算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 灰狼优化算法(GWO),由澳大利亚格里菲斯大学学者 Mirjal ...

  3. Python实现BOA蝴蝶优化算法优化支持向量机分类模型(SVC算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 蝴蝶优化算法(butterfly optimization al ...

  4. Python实现GWO智能灰狼优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 灰狼优化算法(GWO),由澳大利亚格里菲斯大学学者 Mirjal ...

  5. Python实现GWO智能灰狼优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 灰狼优化算法(GWO),由澳大利亚格里菲斯大学学者 Mirjal ...

  6. Python实现BOA蝴蝶优化算法优化支持向量机回归模型(SVR算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 蝴蝶优化算法(butterfly optimization al ...

  7. 麻雀优化算法 优化XGBoost的参数 python代码

    文章目录 麻雀优化算法 麻雀优化算法的改进 加入Ten混沌序列 XGBoost原理 麻雀优化算法优化XGBoost 参数范围 部分代码 画图 优化结果 评价结果和运行时间 适应度曲线 训练集结果 测试 ...

  8. Python实现ALO蚁狮优化算法优化支持向量机分类模型(SVC算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 蚁狮优化(Ant Lion Optimizer,ALO)算法是M ...

  9. Python实现ABC人工蜂群优化算法优化支持向量机分类模型(SVC算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 人工蜂群算法(Artificial Bee Colony, AB ...

  10. 基于蝗虫(蚱蜢)优化算法优化的支持向量机分类模型及其MATLAB实现-附代码

    基于蝗虫(蚱蜢)优化算法GOA优化的支持向量机分类模型SVM及其MATLAB实现-附代码 文章目录 基于蝗虫(蚱蜢)优化算法GOA优化的支持向量机分类模型SVM及其MATLAB实现-附代码 1. 模型 ...

最新文章

  1. 基于可见光(LIFI)通信系统 的机动车智能辅助装置(课程设计)
  2. 电脑安装python3.7说缺少-centos7:python3.7 缺少_ssl模块问题
  3. java线程挂起唤醒_JAVA并发(10)—interrupt唤醒挂起线程
  4. 1070 Mooncake (25 分)【难度: 简单 / 知识点: 贪心】
  5. 网络编程应用:基于TCP协议【实现一个聊天程序】
  6. 使用DelayExchange
  7. CL_CRM_REPORT_QUESTION call CRM_REPORT_RF_CHECK_AUTHORITY
  8. fiddler对手机进行抓包
  9. 如何分析 StackOverflow 异常 ?
  10. Java命令行界面(第25部分):JCommando
  11. Python官方文档学习心得(第四篇)
  12. JAVAWeb汽车销售管理系统
  13. 信息安全:需求进一步升级 行业再上风口
  14. 周期信号的傅里叶级数
  15. 7. gdal进行遥感影像的16位转8位和百分比截断增强(看这篇就够了)
  16. 英语的句号在c语言中是什么意思,英语标点符号的用法
  17. [11g](ALTER SYSTEM SUSPEND)Suspending and Resuming a Database
  18. 使用Mono Cecil对MSIL进行注入
  19. 面经:计算机视觉工程师(字节跳动-飞书部门)
  20. pandas行/列删除

热门文章

  1. 转: ORA-12560: TNS:protocol adapter error(TNS:协议适配器错误)
  2. 《迎向开阔的人生》——刘墉
  3. linux添加计划任务(转载)
  4. Microsoft SQL Server数据库学习(一)
  5. 怎样将一个Long类型的数据转换成字节数组
  6. Hibernate中的merge方法
  7. 小型Web页打包优化(下)
  8. 性能测试的那些事儿!
  9. 使用Jenkins搭建持续集成环境的方法(三)
  10. Eclipse如何重置窗口