遗传拓扑神经网络---Neat

2023-10-11 20:50

本文主要是介绍遗传拓扑神经网络---Neat,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本期课程到这里,博主就默认大家已经对BP、CNN、RNN等基本的神经网络属性以及训练过程都有相应的认知了,如果还未了解最基本的知识,可以翻看博主制作的深度学习的学习路线,按顺序阅读即可。

深度学习的学习路线:往期课程

    

        Hello,又是一个分享的日子,之前博主给大家介绍了遗传演化神经网络,这期博主将在本期推文给大家介绍遗传拓扑神经网络遗传拓扑神经网络同样是结合了神经网络和遗传算法与进化策略产生的一种全新模型。它通过模仿自然界“适者生存”的原则来赋予神经网络在代际循环中优化的力量,能有效克服传统神经网络在训练过程中的缺点。它与上期介绍的遗传演化神经网络不同的地方在于加入了交叉操作,且它的年代比较久远了,是2003年的一篇论文,因为近些年来算力的提升与强化学习的兴起,又走进了人们的视野。好了,闲言少叙,我们这就走进遗传与深度学习的世界。

Neat算法的论文

《Evolving Neural Networks through Augmenting Topologies 》

提取码:yxph

https://pan.baidu.com/s/1SmMEsgSMEdUwnhvsmwfnPg&shfl=sharepset

本文内容概要:

  1. 遗传拓扑神经网络(Neat算法)原理

  2. 遗传拓扑神经网络(Neat算法)实验

  3. 实验总结

  4. 新的征程---NLP修炼指北

遗传拓扑神经网络的思想

 原理                                                                                     

        正如之前的遗传演化神经网络的推文所说,遗传算法是个通用框架,因此我们需要根据具体的问题来定义遗传算法。不过,既然它是框架,那它就会有通用的几部分供我们选择,因此博主在此给大家先讲下整体的流程。

    整体框架可分为三部分:交叉、变异与适应度。不过虽然整体的流程是一致的,但是因为问题不同,我们定义的基因也有所不同,那交叉与变异也会随之变化。

    这篇论文将神经元及其连接定义成基因组,而遗传演化神经网络论文是将网络层及其学习率定义成基因组,小伙伴们可以对比着学习两者的异同,这样也能更好地感受为什么说遗传算法是解决一般性问题的通用框架,就是因为我们可以根据问题去定义基因组。

算法核心                                                                                

 

A.个体基因与种群规模个体基因:(结点链接与结点类型)种群规模:150物种划分:基于权值相似度划分物种由于该论文已经有人写好了框架,因此以上参数在配置文件中修改即可,这将会在代码那里给大家演示。

伪代码:

while condition:if random.random < 交叉率:选择操作(适应度越高,越容易被选中)物种内交叉if random.random < 变异率:变异操作评估适应度else:  # 直接变异if random.random < 变异率:变异操作评估适应度# 淘汰操作每个物种保留一定数量的个体if random.random < 灭绝率:灭绝最差的物种种群间的物种交叉生成亚种, 弥补新的物种conditon:迭代次数 or fittness达到设定的阈值评估适应度:fitness = 1/(训练集的误差)^2这里的适应度函数是自定义的,大家可以根据自己的想法去定义。 

交叉操作:

交叉操作

    论文通过一个链表定义基因的节点连接,选择两个个体进行交叉的时候,按照链表的顺序,逐一操作,最后生成新的子代。

变异操作:

变异操作

    同样地,变异操作也是在链表中进行,且会有两种变异:增加网络连接和增加网络节点。

实验

实验环境                                                                                          

  • Anaconda Python 3.7 

  • Jupyter Notebook

  • Keras

  • 开发环境安装在之前的推文中已经介绍,还没安装的小伙伴可以翻一下。

  • Python开发环境---Windows与服务器篇

  • Python深度学习开发环境---Keras

  • Neat-Python官网代码

    https://neat-python.readthedocs.io/en/latest/neat_overview.html

  • 实现该篇论文的代码也加入了可视化操作

windows 用户:
cmd命令行输入以下命令
conda install -c conda-forge graphviz
conda install -c conda-forge python-graphvizlinux 用户:
命令行输入以下命令
sudo apt-get install graphviz

 

 

实验                                                                                                 

    这里实验使用官网的例子:实现一个能判断XOR异或操作的网络,让大家感受下具体如何操作。

xor_inputs = [(0.0, 0.0), (0.0, 1.0), (1.0, 0.0), (1.0, 1.0)]
xor_outputs = [(0.0,),    (1.0,),     (1.0,),     (0.0,)]
"""
异或:输入相异,输出1, 输入相同,输出0
"""

     上文提到,有人已经实现了这篇论文的代码框架,我们只需要修改配置文件的相应参数,就可以运行Neat算法了,下面给大家介绍下Neat算法的配置文件,官网有对配置文件更详细的解释,这里博主只是标注一些自己用到的参数。

neat算法配置文件详细解释

https://neat-python.readthedocs.io/en/latest/config_file.html

#--- parameters for the XOR-2 experiment ---#[NEAT]
fitness_criterion     = max
fitness_threshold     = 3.9  # 适应度的阈值
pop_size              = 150  # 种群规模
reset_on_extinction   = False[DefaultGenome]
# node activation options  # 结点的激励函数
activation_default      = sigmoid
activation_mutate_rate  = 0.0
activation_options      = sigmoid# node aggregation options  # 结点的聚合选择 (一般默认)
aggregation_default     = sum
aggregation_mutate_rate = 0.0
aggregation_options     = sum# node bias options  # 结点的偏置选择
bias_init_mean          = 0.0
bias_init_stdev         = 1.0
bias_max_value          = 30.0
bias_min_value          = -30.0
bias_mutate_power       = 0.5
bias_mutate_rate        = 0.7
bias_replace_rate       = 0.1# genome compatibility options
compatibility_disjoint_coefficient = 1.0
compatibility_weight_coefficient   = 0.5# connection add/remove rates
conn_add_prob           = 0.5
conn_delete_prob        = 0.5# connection enable options
enabled_default         = True
enabled_mutate_rate     = 0.01feed_forward            = True  # 是否加入RNN神经元
initial_connection      = full# node add/remove rates  # 结点的添加和删除概率
node_add_prob           = 0.2
node_delete_prob        = 0.2# network parameters  # 输入层、输出层、隐藏层的神经元个数
num_hidden              = 2
num_inputs              = 2
num_outputs             = 1# node response options
response_init_mean      = 1.0
response_init_stdev     = 0.0
response_max_value      = 30.0
response_min_value      = -30.0
response_mutate_power   = 0.0
response_mutate_rate    = 0.0
response_replace_rate   = 0.0# connection weight options
weight_init_mean        = 0.0
weight_init_stdev       = 1.0
weight_max_value        = 30
weight_min_value        = -30
weight_mutate_power     = 0.5
weight_mutate_rate      = 0.8
weight_replace_rate     = 0.1[DefaultSpeciesSet]  
# genomic distance小于此距离被认为是同一物种
compatibility_threshold = 3.0 [DefaultStagnation]
species_fitness_func = max
max_stagnation       = 20
species_elitism      = 2[DefaultReproduction]
elitism            = 2   # 保留最优的个体遗传到下一代的个数
survival_threshold = 0.2  # 每一代每个物种的存活率

代码                                                                                                 

from __future__ import print_function
import os
import neat
import visualize# XOR异或的输入输出数据
xor_inputs = [(0.0, 0.0), (0.0, 1.0), (1.0, 0.0), (1.0, 1.0)]
xor_outputs = [   (0.0,),     (1.0,),     (1.0,),     (0.0,)]def eval_genomes(genomes, config):# 评估函数    for genome_id, genome in genomes:genome.fitness = 4.0net = neat.nn.FeedForwardNetwork.create(genome, config)for xi, xo in zip(xor_inputs, xor_outputs):output = net.activate(xi)genome.fitness -= (output[0] - xo[0]) ** 2def run(config_file):# 读取配置配置文件config = neat.Config(neat.DefaultGenome, neat.DefaultReproduction,neat.DefaultSpeciesSet, neat.DefaultStagnation,config_file)# 创建种群p = neat.Population(config)# 打印训练过程p.add_reporter(neat.StdOutReporter(True))stats = neat.StatisticsReporter()p.add_reporter(stats)p.add_reporter(neat.Checkpointer(5))# 迭代300次winner = p.run(eval_genomes, 300)# 显示最佳网络print('\nBest genome:\n{!s}'.format(winner))print('\nOutput:')winner_net = neat.nn.FeedForwardNetwork.create(winner, config)for xi, xo in zip(xor_inputs, xor_outputs):output = winner_net.activate(xi)print("input {!r}, expected output {!r}, got {!r}".format(xi, xo, output))node_names = {-1:'A', -2: 'B', 0:'A XOR B'}visualize.draw_net(config, winner, True, node_names=node_names)visualize.plot_stats(stats, ylog=False, view=True)visualize.plot_species(stats, view=True)p = neat.Checkpointer.restore_checkpoint('neat-checkpoint-4')p.run(eval_genomes, 10)if __name__ == '__main__':config_path = os.path.join('config-feedforward')run(config_path)

Git链接

代码

https://github.com/ChileWang0228/DeepLearningTutorial/blob/master/Neat/xor.ipynb

训练结果                                                                                             

生成的.svg后缀文件用google浏览器打开即可,显示的就是下面两张图。

生成的网络结构

fittness趋势图

视频版                                                                                        

视频版包含了代码讲解部分,不过博主的代码都做了相应的注释,相信大家都能看懂,喜欢视频版的小伙伴可以去观看~~~

bilibili值得拥有~(っ•̀ω•́)っ✎⁾⁾ 我爱学习

https://space.bilibili.com/299585150


总结

        好了,到这里,我们就已经将遗传拓扑神经网络(Neat算法)的知识点讲完了。大家在掌握了整个流程之后,可以把官方代码下载下来,调一下配置文件,就可以运行了。当然,有些小伙伴可能会想着自己定义一个新的交叉或者变异操作,这就需要对着Neat算法的源码修改相应的代码了。

      最后总结一下,因为算力的提升,遗传算法+深度学习近年来逐渐走入人们的视野,不过应用比较广泛的是在强化学习领域。究其原因还是因为强化学习的本质和遗传算法一致,都是适者生存,不适者淘汰。比如有人用Neat算法训练了个超级马里奥,其实就是训练一个机器人在游戏环境中生存,适应度函数可以定义为在游戏里的得分亦或者是在游戏中的存活时间,在不断迭代过程中,存活下来的机器人一定是对当前环境反馈最佳的。

      当然了,这里提及Neat算法,主要是想让大家对比两期遗传算法的实验,掌握遗传算法的流程精髓,顺带了解一下强化学习是干嘛的。

      最后还要说一下,到这里为止,深度学习的基础课程也就告一段落了。下一期开始,博主就开始更新NLP方面的内容了,这是博主研究生的主攻方向,希望能在接下来的分享中,大家共同进步。

~~~~~完结撒花~~~~~

     

    

        如果本期推文有用,那就点个赞吧,你们的点赞是博主持续更新的动力,感谢每一位小伙伴的关注~

    


这篇关于遗传拓扑神经网络---Neat的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/190753

相关文章

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

机器学习之监督学习(三)神经网络

机器学习之监督学习(三)神经网络基础 0. 文章传送1. 深度学习 Deep Learning深度学习的关键特点深度学习VS传统机器学习 2. 生物神经网络 Biological Neural Network3. 神经网络模型基本结构模块一:TensorFlow搭建神经网络 4. 反向传播梯度下降 Back Propagation Gradient Descent模块二:激活函数 activ

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他

图神经网络(2)预备知识

1. 图的基本概念         对于接触过数据结构和算法的读者来说,图并不是一个陌生的概念。一个图由一些顶点也称为节点和连接这些顶点的边组成。给定一个图G=(V,E),  其 中V={V1,V2,…,Vn}  是一个具有 n 个顶点的集合。 1.1邻接矩阵         我们用邻接矩阵A∈Rn×n表示顶点之间的连接关系。 如果顶点 vi和vj之间有连接,就表示(vi,vj)  组成了

自然语言处理系列六十三》神经网络算法》LSTM长短期记忆神经网络算法

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十三神经网络算法》LSTM长短期记忆神经网络算法Seq2Seq端到端神经网络算法 总结 自然语言处理系列六十三 神经网络算法》LSTM长短期记忆神经网络算法 长短期记忆网络(LSTM,Long S

神经网络训练不起来怎么办(零)| General Guidance

摘要:模型性能不理想时,如何判断 Model Bias, Optimization, Overfitting 等问题,并以此着手优化模型。在这个分析过程中,我们可以对Function Set,模型弹性有直观的理解。关键词:模型性能,Model Bias, Optimization, Overfitting。 零,领域背景 如果我们的模型表现较差,那么我们往往需要根据 Training l

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信息。 1. 医学图像分析的挑战 医学图像分析面临诸多挑战,其中包括: 图像数据的复杂性:医学图像通常具有高维度和复杂的结构

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重