import math
import random
# 神经网络3层, 1个隐藏层; 4个input和1个output
network = [4, [16], 1]
population = 50
elitism = 0.2
random_behaviour = 0.1
mutation_rate = 0.5
mutation_range = 2
historic = 0
low_historic = False
score_sort = -1
n_child = 1
# 激活函数
def sigmoid(z):
return 1.0/(1.0+math.exp(-z))
# random number
def random_clamped():
return random.random()*2-1
# "神经元"
class Neuron():
def __init__(self):
self.biase = 0
self.weights = []
def init_weights(self, n):
self.weights = []
for i in range(n):
self.weights.append(random_clamped())
def __repr__(self):
return 'Neuron weight size:{} biase value:{}'.format(len(self.weights), self.biase)
# 层
class Layer():
def __init__(self, index):
self.index = index
self.neurons = []
def init_neurons(self, n_neuron, n_input):
self.neurons = []
for i in range(n_neuron):
neuron = Neuron()
neuron.init_weights(n_input)
self.neurons.append(neuron)
def __repr__(self):
return 'Layer ID:{} Layer neuron size:{}'.format(self.index, len(self.neurons))
# 神经网络
class NeuroNetwork():
def __init__(self):
self.layers = []
# input:输入层神经元数 hiddens:隐藏层 output:输出层神经元数
def init_neuro_network(self, input, hiddens , output):
index = 0
previous_neurons = 0
# input
layer = Layer(index)
layer.init_neurons(input, previous_neurons)
previous_neurons = input
self.layers.append(layer)
index += 1
# hiddens
for i in range(len(hiddens)):
layer = Layer(index)
layer.init_neurons(hiddens[i], previous_neurons)
previous_neurons = hiddens[i]
self.layers.append(layer)
index += 1
# output
layer = Layer(index)
layer.init_neurons(output, previous_neurons)
self.layers.append(layer)
def get_weights(self):
data = { 'network':[], 'weights':[] }
for layer in self.layers:
data['network'].append(len(layer.neurons))
for neuron in layer.neurons:
for weight in neuron.weights:
data['weights'].append(weight)
return data
def set_weights(self, data):
previous_neurons = 0
index = 0
index_weights = 0
self.layers = []
for i in data['network']:
layer = Layer(index)
layer.init_neurons(i, previous_neurons)
for j in range(len(layer.neurons)):
for k in range(len(layer.neurons[j].weights)):
layer.neurons[j].weights[k] = data['weights'][index_weights]
index_weights += 1
previous_neurons = i
index += 1
self.layers.append(layer)
def feed_forward(self, inputs):
for i in range(len(inputs)):
self.layers[0].neurons[i].biase = inputs[i]
prev_layer = self.layers[0]
for i in range(len(self.layers)):
# 第一层没有weights
if i == 0:
continue
for j in range(len(self.layers[i].neurons)):
sum = 0
for k in range(len(prev_layer.neurons)):
sum += prev_layer.neurons[k].biase * self.layers[i].neurons[j].weights[k]
self.layers[i].neurons[j].biase = sigmoid(sum)
prev_layer = self.layers[i]
out = []
last_layer = self.layers[-1]
for i in range(len(last_layer.neurons)):
out.append(last_layer.neurons[i].biase)
return out
def print_info(self):
for layer in self.layers:
print(layer)
页面更新:2024-03-13
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号