-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.gd
93 lines (73 loc) · 2.62 KB
/
main.gd
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
91
92
93
extends Node
var hLayer = Layer.new([Neuron.new(), Neuron.new(), Neuron.new(), Neuron.new()])
var hLayer2 = Layer.new([Neuron.new(), Neuron.new(), Neuron.new(), Neuron.new()])
var bestNetwork = Network.new([hLayer, hLayer2])
var batchSize: int = 50
var mutationRate: float = 0.1
var data
var auto: bool = false
func _ready():
$BatchLabel/HSlider.value = batchSize
$BatchLabel.text = 'Batch size: %s' % batchSize
$MutationLabel.text = 'Mutations: %s' % mutationRate
$MutationLabel/MutationSlider.value = mutationRate
data = CsvLoader.loadCSV("res://data/gender.csv")
var weights: Array = []
var heights: Array = []
for dataPoint in data:
if dataPoint.has('Weight') and dataPoint.has('Height'):
weights.append(int(dataPoint['Weight']))
heights.append(int(dataPoint['Height']))
Utils.meanWeight = Utils.mean(weights)
Utils.meanHeight = Utils.mean(heights)
if Utils.savedNetwork:
bestNetwork = Utils.savedNetwork
func _on_h_slider_value_changed(value):
batchSize = value
$BatchLabel.text = 'Batch size: %s' % value
func _on_mutation_slider_value_changed(value):
mutationRate = value
$MutationLabel.text = 'Mutations: %s' % value
var networks: Array[Network]
var currentlyRunning: bool = false
func runGeneration():
currentlyRunning = true
networks.clear()
var lowestLossNetwork = bestNetwork
var lowestLoss: float = 1.0
for i in batchSize:
var batchNetwork = bestNetwork.copy()
batchNetwork.mutate()
networks.append(batchNetwork)
var expectedOutputs: Array
for dataPoint in data:
if dataPoint.has('Gender') and dataPoint['Gender'] == 'male':
expectedOutputs.append(1)
elif dataPoint.has('Gender') and dataPoint['Gender'] == 'female':
expectedOutputs.append(0)
for _network in networks:
var outputs: Array
var losses: Array
for dataPoint in data:
if dataPoint.has('Weight') and dataPoint.has('Height'):
var weight = int(dataPoint['Weight']) - Utils.meanWeight
var height = int(dataPoint['Height']) - Utils.meanHeight
var output = _network.feedForward([height, weight])
outputs.append(output)
var loss = Utils.calculateLoss(outputs, expectedOutputs)
if loss < lowestLoss:
lowestLossNetwork = _network
lowestLoss = loss
$LossLabel.text = 'Loss: %s' % loss
bestNetwork = lowestLossNetwork
currentlyRunning = false
func _on_auto_speed_timeout():
if auto and not currentlyRunning:
runGeneration()
func _on_auto_toggled(button_pressed):
auto = button_pressed
func _on_speed_slider_value_changed(value):
$AutoSpeed.wait_time = 1.0 / value
func _on_test_network_pressed():
Utils.savedNetwork = bestNetwork
get_tree().change_scene_to_file("res://trained_network_test.tscn")