-
Notifications
You must be signed in to change notification settings - Fork 0
/
neuronalNetwork.py
90 lines (65 loc) · 2.75 KB
/
neuronalNetwork.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import numpy
import scipy.special
import random
from constants import *
class NNet:
def __init__(self, numInput, numHidden, numOutput):
self.numInput = numInput
self.numHidden = numHidden
self.numOutput = numOutput
self.weightsInputHidden = numpy.random.uniform(-0.5, 0.5, size=(self.numHidden, self.numInput))
self.weightsHiddenOutput = numpy.random.uniform(-0.5, 0.5, size=(self.numOutput, self.numHidden))
self.activationFunction = lambda x: scipy.special.expit(x)
def getOutputs(self, inputs):
numpyInputs = numpy.array(inputs, ndmin=2).T
multiplicationInputsHidden = numpy.dot(self.weightsInputHidden, numpyInputs)
finalMultiplicationInputsHidden = self.activationFunction(multiplicationInputsHidden)
multiplicationHiddenOutput = numpy.dot(self.weightsHiddenOutput, finalMultiplicationInputsHidden)
finalMultiplicationHiddenOutput = self.activationFunction(multiplicationHiddenOutput)
return finalMultiplicationHiddenOutput
@staticmethod
def modifyWeights(array):
return [NNet.modifyArray(array[0]), NNet.modifyArray(array[1])]
@staticmethod
def create_mixed_weights(array, net1, net2):
array.append(NNet.mixArrays(net1[0][0], net2[0][0]))
array.append(NNet.mixArrays(net1[1][0], net2[1][0]))
return array
@staticmethod
def modifyArray(array):
for x in numpy.nditer(array, op_flags=['readwrite']):
if random.random() < MUTATION_MODIFY_CHANCE:
x[...] = numpy.random.random_sample() - 0.5
return array
@staticmethod
def mixArrays(array1, array2):
totalEntries = array1.size
numRows = array1.shape[0]
numCols = array1.shape[1]
numToTake = totalEntries - (int(totalEntries * MUTATION_ARRAY_MIX_PERCENT))
idx = numpy.random.choice(numpy.arange(totalEntries), numToTake, replace=False)
res = numpy.random.rand(numRows, numCols)
for row in range(0, numRows):
for col in range(0, numCols):
index = row * numCols + col
if index in idx:
res[row][col] = array1[row][col]
else:
res[row][col] = array2[row][col]
return res
def tests():
array1 = numpy.random.uniform(-0.5, 0.5, size=(3, 3))
array2 = numpy.random.uniform(-0.5, 0.5, size=(3, 3))
print('array1 size', array1.size, sep='\n')
print('array1', array1, sep='\n')
print()
"""
NNet.modifyArray(array1)
print('array1 modified', array1, sep='\n')
print()
print('array2', array2, sep='\n')
print()
mixed = NNet.mixArrays(array1, array2)
print('mixed arrays', mixed, sep='\n')"""
if __name__ == "__main__":
tests()