def backprop(layers, outputs=[], learning_rate=1): for layer, neurons in reversed(list(enumerate(layers))): is_input_layer = layer is 0 is_top_layer = layer is len(layers) - 1 if is_top_layer: for index, neuron in enumerate(neurons): s = neuron.output * (1 - neuron.output) neuron.ideal_output = 1 if neuron.name in outputs else 0 neuron.error = (neuron.ideal_output - neuron.output) * s for i, node in enumerate(layers[layer - 1]): link = Select.link_between(node, neuron) link.weight += ((neuron.error * node.output) * learning_rate) link.save() elif is_top_layer and not is_input_layer: for index, neuron in enumerate(neurons): error_sum = 0 s = neuron.output * (1 - output.neuron) for i, node in enumerate(layers[layer + 1]): link = Select.link_between(neuron, node) error_sum += node.error * link.weight neuron.error = error_sum * s for i, node in enumerate(layers[layer - 1]): link = Select.link_between(node, neuron) link.weight += ((neuron.error * node.output) * learning_rate) link.save() return layers
def build_network(network): layers = [] for layer in Select.layers_in(network): neuron_list = [] for pool in Select.pools_in(layer): for neuron in Select.neurons_in(pool): neuron_list.append(neuron) layers.append(neuron_list) return layers
def activate_network(layers, inputs=[]): for layer, neurons in enumerate(layers): is_input_layer = layer is 0 for index, neuron in enumerate(neurons): if is_input_layer: neuron.output = 1 if neuron.name in inputs else 0 else: weights = [] outputs = [] for i, node in enumerate(layers[layer - 1]): outputs.append(node.output) link = Select.link_between(node, neuron) weights.append(link.weight) weighted_sum = Computation.sum(outputs, weights) neuron.output = Computation.activation(weighted_sum) return layers