-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_2.gd
155 lines (154 loc) · 4.23 KB
/
test_2.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
extends Control
#
#class NeuralNetwork:
#var ni: int # Número de nodos de entrada
#var nh: int # Número de nodos ocultos
#var no: int # Número de nodos de salida
#
#var ai: Array # Activaciones de entrada
#var ah: Array # Activaciones ocultas
#var ao: Array # Activaciones de salida
#
#var wi: Array # Pesos de entrada a capa oculta
#var wo: Array # Pesos de capa oculta a salida
#
#var ci: Array # Cambios previos en los pesos de entrada
#var co: Array # Cambios previos en los pesos de salida
#
#func _init(num_inputs: int, num_hidden: int, num_outputs: int):
## Configurar los nodos
#ni = num_inputs + 1 # +1 por el nodo de sesgo
#nh = num_hidden
#no = num_outputs
#
## Inicializar activaciones
#ai = []
#ah = []
#ao = []
#for i in range(ni): ai.append(1.0)
#for j in range(nh): ah.append(1.0)
#for k in range(no): ao.append(1.0)
#
## Inicializar pesos con valores aleatorios
#wi = _make_matrix(ni, nh, -0.2, 0.2)
#wo = _make_matrix(nh, no, -2.0, 2.0)
#
## Inicializar cambios previos para momento
#ci = _make_matrix(ni, nh, 0.0, 0.0)
#co = _make_matrix(nh, no, 0.0, 0.0)
#
## Crear una matriz inicializada con valores aleatorios
#func _make_matrix(rows: int, cols: int, a: float, b: float) -> Array:
#var matrix = []
#for i in range(rows):
#var row = []
#for j in range(cols):
#row.append(randf_range(a, b))
#matrix.append(row)
#return matrix
#
## Función de activación Sigmoid
#func sigmoid(x: float) -> float:
#return tanh(x)
#
## Derivada de la función Sigmoid
#func dsigmoid(y: float) -> float:
#return 1.0 - pow(y, 2)
#
## Propagación hacia adelante
#func update(inputs: Array) -> Array:
#if inputs.size() != ni - 1:
#print("Error: Número incorrecto de entradas")
#return []
#
## Activaciones de entrada
#for i in range(ni - 1):
#ai[i] = inputs[i]
#
## Activaciones de la capa oculta
#for j in range(nh):
#var sum = 0.0
#for i in range(ni):
#sum += ai[i] * wi[i][j]
#ah[j] = sigmoid(sum)
#
## Activaciones de la capa de salida
#for k in range(no):
#var sum = 0.0
#for j in range(nh):
#sum += ah[j] * wo[j][k]
#ao[k] = sigmoid(sum)
#
#return ao.duplicate()
#
## Retropropagación
#func back_propagate(targets: Array, learning_rate: float, momentum: float) -> float:
#if targets.size() != no:
#print("Error: Número incorrecto de valores objetivo")
#return 0.0
#
## Cálculo de los errores de salida
#var output_deltas = []
#for k in range(no):
#var error = targets[k] - ao[k]
#output_deltas.append(dsigmoid(ao[k]) * error)
#
## Cálculo de los errores de la capa oculta
#var hidden_deltas = []
#for j in range(nh):
#var error = 0.0
#for k in range(no):
#error += output_deltas[k] * wo[j][k]
#hidden_deltas.append(dsigmoid(ah[j]) * error)
#
## Actualización de los pesos de salida
#for j in range(nh):
#for k in range(no):
#var change = output_deltas[k] * ah[j]
#wo[j][k] += learning_rate * change + momentum * co[j][k]
#co[j][k] = change
#
## Actualización de los pesos de entrada
#for i in range(ni):
#for j in range(nh):
#var change = hidden_deltas[j] * ai[i]
#wi[i][j] += learning_rate * change + momentum * ci[i][j]
#ci[i][j] = change
#
## Calcular el error total
#var error = 0.0
#for k in range(no):
#error += 0.5 * pow(targets[k] - ao[k], 2)
#return error
#
## Entrenar la red neuronal
#func train(patterns: Array, iterations: int = 1000, learning_rate: float = 0.5, momentum: float = 0.1):
#for i in range(iterations):
#var error = 0.0
#for p in patterns:
#var inputs = p[0]
#var targets = p[1]
#update(inputs)
#error += back_propagate(targets, learning_rate, momentum)
#if i % 100 == 0:
#print("Iteración %d, Error: %.5f" % [i, error])
#
## Probar la red
#func test(patterns: Array):
#for p in patterns:
#var output = update(p[0])
#print("Entrada: %s -> Salida: %.5f, Objetivo: %s" % [p[0], output[0], p[1]])
#
## Ejemplo de uso: función XOR
#func _ready():
#var patterns = [
#[[0, 0], [0]],
#[[0, 1], [1]],
#[[1, 0], [1]],
#[[1, 1], [0]]
#]
#
#var nn = NeuralNetwork.new(2, 2, 1)
#nn.train(patterns, 1000, 0.5, 0.1)
#print("Prueba de la red neuronal entrenada:")
#nn.test(patterns)