我想使用create的神经网络,这样我就可以控制如何选择最合适的人(训练)以及其他事情,但是create的前馈网络的源代码不能单独使用(创建一个配置文件和基因组)。
nn.feed_forward的源代码
from neat.graphs import feed_forward_layers
class FeedForwardNetwork(object):
def __init__(self, inputs, outputs, node_evals):
self.input_nodes = inputs
self.output_nodes = outputs
self.node_evals = node_evals
self.values = dict((key, 0.0) for key in inputs + outputs)
def activate(self, inputs):
if len(self.input_nodes) != len(inputs):
raise RuntimeError("Expected {0:n} inputs, got {1:n}".format(len(self.input_nodes), len(inputs)))
for k, v in zip(self.input_nodes, inputs):
self.values[k] = v
for node, act_func, agg_func, bias, response, links in self.node_evals:
node_inputs = []
for i, w in links:
node_inputs.append(self.values[i] * w)
s = agg_func(node_inputs)
self.values[node] = act_func(bias + response * s)
return [self.values[i] for i in self.output_nodes]
@staticmethod
def create(genome, config): # I don't want to have to pass in either arguments to create a network
""" Receives a genome and returns its phenotype (a FeedForwardNetwork). """
# Gather expressed connections.
connections = [cg.key for cg in genome.connections.values() if cg.enabled]
layers = feed_forward_layers(config.genome_config.input_keys, config.genome_config.output_keys, connections)
node_evals = []
for layer in layers:
for node in layer:
inputs = []
for conn_key in connections:
inode, onode = conn_key
if onode == node:
cg = genome.connections[conn_key]
inputs.append((inode, cg.weight))
ng = genome.nodes[node]
aggregation_function = config.genome_config.aggregation_function_defs.get(ng.aggregation)
activation_function = config.genome_config.activation_defs.get(ng.activation)
node_evals.append((node, activation_function, aggregation_function, ng.bias, ng.response, inputs))
return FeedForwardNetwork(config.genome_config.input_keys, config.genome_config.output_keys, node_evals)我也希望能够变异神经网络(连接,权重,等等)。
发布于 2022-07-22 01:46:09
要创建FeedForwardNetwork,您需要使用create方法或手动设置inputs, outputs, node_evals。
输入
input是输入节点的“键”(引用文档)的列表。它是一个list of int,类似于[-1, -2, ...,-num_inputs],其中num_inputs是您在文件中设置的输入节点的数量。
输出
output是输出节点的“键”列表。它是一个list of int,类似于[0, 1, 2, ..., (num_outputs-1)],其中num_outputs是您在config_file中设置的输出节点的数量。
node_evals
node_evals是一个元组列表。
元组的大小:
元组中的每个元素对应于一个具有" in“连接的节点,因此元组的大小是网络中的num_of_hiddens+num_of_outputs。(注意,这是由基因组而不是配置决定的,因此"num_of_outputs“和"num_of_hiddens”可以不同于config_file中的"num_outputs“和"num_hidden”)。
元组中的元素:
正如您在create方法和activate方法中所看到的,元组中的一个元素包括:
tuple[0]:对应节点的键。tuple[1]:节点的activation_function。我认为它是一个输入浮点数和输出浮点数的函数。tuple[2]:节点的aggregation_function。我认为任何函数都可以输入浮点数列表,并输出另一个浮点数。例如,计算列表中元素的和。tuple[3]:节点的偏差,浮点。tuple[4]:节点的响应,浮动。tuple[5]:为这个神经元(节点)提供输入的链接,表示为节点i。这是一个元组的列表。tuple[5]的长度是当前神经元i的输入神经元数。对于tuple[5]内部的子元组,sub_tuple[0]是输入神经元的关键(这里,“输入”是指一个节点输入到节点i,而不是整个网络的“输入”),而sub_tuple[1] (属于float类型)是某个输入神经元与节点i之间的连接权重。如果您查看activate的实现,您可能会更好地理解"activation_function“、"aggregation_function”、“偏差”、“响应”和“链接”的物理含义。
我还建议您在这里上运行一个示例,在创建FeedForwardNetwork时添加一个断点,并检查数据类型。
https://stackoverflow.com/questions/72974928
复制相似问题