如何独立使用NEAT前馈网络并自定义训练与变异逻辑
独立使用NEAT前馈网络并自定义全训练流程方案
FeedForwardNetwork类本身没有强绑定NEAT内置的Config、Genome体系,你不需要依赖自带的create()静态方法生成实例,直接调用构造函数即可自主创建网络,自定义选择、变异全流程逻辑。
1. 脱离Config/Genome创建网络实例
FeedForwardNetwork的构造函数仅需要三个无外部依赖的参数:
inputs:输入节点ID列表,可自行定义ID规则,通常遵循NEAT惯例用负ID标记输入节点outputs:输出节点ID列表,通常用非负ID标记node_evals:节点计算规则列表,每个元素为6元组格式(节点ID, 激活函数, 聚合函数, 偏置值, 响应系数, 上游连接列表),其中上游连接列表每个元素为(上游节点ID, 连接权重)
你可以直接复用NEAT自带的feed_forward_layers工具做拓扑分层,这个函数是纯逻辑工具,仅需要传入输入节点ID、输出节点ID、启用的连接列表即可返回分层结果,不依赖任何配置或基因组对象。
最小可运行示例:
import random import numpy as np from neat.graphs import feed_forward_layers from neat.nn.feed_forward import FeedForwardNetwork import neat.activations as activations import neat.aggregations as aggregations # 自定义网络基础参数:2输入、1输出、1个隐藏节点 input_nodes = [-1, -2] output_nodes = [0] # 自定义连接与权重,格式为 (入节点ID, 出节点ID): 权重值 enabled_connections = { (-1, 1): 0.5, (-2, 1): -0.3, (1, 0): 0.8 } # 拓扑分层 conn_keys = list(enabled_connections.keys()) layers = feed_forward_layers(input_nodes, output_nodes, conn_keys) # 构造节点计算规则 node_evals = [] for layer in layers: for node in layer: # 收集当前节点的所有入站连接 node_input_links = [] for (in_node, out_node), weight in enabled_connections.items(): if out_node == node: node_input_links.append((in_node, weight)) # 自定义节点参数,不需要从配置读取 node_evals.append(( node, activations.sigmoid, # 可替换为任意自定义激活函数 aggregations.sum, # 可替换为任意自定义聚合函数 0.0, # 自定义偏置 1.0, # 自定义响应系数 node_input_links )) # 直接实例化网络,无需传入genome或config net = FeedForwardNetwork(input_nodes, output_nodes, node_evals) # 测试前向传播 print(net.activate([0.5, 0.2]))
2. 自定义变异操作实现
你可以自行维护网络的连接、节点参数存储结构,不需要依赖NEAT内置的Genome类,常规NEAT变异逻辑可按如下方式实现:
- 权重变异:按指定概率对连接权重做高斯扰动,小概率直接随机重置权重
- 新增节点变异:随机选中一条现有连接,拆分该连接为两段,中间插入新的隐藏节点
- 新增连接变异:随机选择两个不存在连接、不形成环路的节点,添加新连接并随机初始化权重
- 节点参数变异:按小概率扰动节点偏置、响应系数,或替换激活函数
基础权重变异示例:
def mutate_connection_weights(connections, mutate_prob=0.8, reset_prob=0.05, mutate_strength=0.5): for conn_key in list(connections.keys()): if random.random() < mutate_prob: if random.random() < reset_prob: # 直接重置为[-2,2]区间随机值 connections[conn_key] = random.uniform(-2, 2) else: # 叠加高斯噪声扰动 connections[conn_key] += np.random.normal(0, mutate_strength) return connections
完成变异后,重新按照第一步的拓扑分层、构造node_evals的流程生成新的网络实例即可,整个适者选择、交叉、评估、迭代的训练流程完全可以自主控制,不需要绑定NEAT内置的训练循环。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

