Ich habe jetzt das ganze so umgeschrieben das ich nicht mehr meine Klasse habe. Weiß jetzt allerdings nicht wo ich da das ganze jetzt implementier so das, dass ganze läuft ich hab echt schon einige Stellen und Konstellationen ausprobiert bekomme es aber nicht hin.
Code: Alles auswählen
def train(self, input_array, target_array):
# generating the hidden outputs
inputs = np.zeros((len(input_array), 1))
for i in range(len(input_array)):
inputs[i][0] = input_array[i]
#multiplys weights input --> hidden * inputs
hidden = np.zeros(((np.size(self.weights_ih, 1)), (np.size(inputs, 0))))
hidden = np.dot(self.weights_ih, inputs)
#add bias
hidden += self.bias_h
# activation function
for val in np.nditer(hidden, op_flags=['readwrite']):
val[...] = sigmoid(val)
# hidden.map(relu)
# generating the outputs output
outputs = np.zeros(((np.size(self.weights_ho, 1)), (np.size(hidden, 0))))
outputs = np.dot(self.weights_ho, hidden)
outputs += self.bias_o
for val in np.nditer(outputs, op_flags=['readwrite']):
val[...] = sigmoid(val)
#outputs.map(drelu)
# convert output array to matrix object
targets = np.zeros((len(target_array), 1))
for i in range(len(target_array)):
targets[i][0] = target_array[i]
# calculate the error = targets - outputs
output_errors = targets - outputs
# calculate gradient = outputs * (1 - outputs)
#gradients = Matrix.maps(outputs, dsigmoid)
gradients = np.zeros(((np.size(outputs, 1)), (np.size(outputs, 0))))
gradients = np.random.rand((np.size(outputs, 1)), (np.size(outputs, 0))) * 2 - 1
data = np.fromiter((dsigmoid(x) for x in outputs), outputs.dtype, count=len(outputs))
gradients = data.reshape(len(data), 1)
# gradients = Matrix.maps(outputs, drelu)
gradients *= output_errors
gradients *= self.learning_rate
# calculate deltas
hidden_t = hidden.transpose()
#multiplys gradients and hidden Transpose
weight_ho_deltas = np.zeros(((np.size(gradients, 1)), (np.size(hidden_t, 0))))
weight_ho_deltas = np.dot(gradients, hidden_t)
# adjust the weights by deltas
self.weights_ho += weight_ho_deltas
# adjust the bias by its deltas (which is the gradients)
self.bias_o += (gradients)
# calculate the hidden layer errors
who_t = self.weights_ho.transpose()
hidden_errors = np.zeros(((np.size(who_t, 1)), (np.size(output_errors, 0))))
hidden_errors = np.dot(who_t, output_errors)
# calculate hidden gradient
#hidden_gradient = Matrix.maps(hidden, dsigmoid)
hidden_gradient = np.zeros(((np.size(hidden, 1)), (np.size(hidden, 0))))
hidden_gradient = np.random.rand((np.size(hidden, 1)), (np.size(hidden, 0))) * 2 - 1
data = np.fromiter((dsigmoid(x) for x in hidden), hidden.dtype, count=len(hidden))
hidden_gradient = data.reshape(len(data), 1)
# hidden_gradient = Matrix.maps(hidden, drelu)
hidden_gradient *= hidden_errors
hidden_gradient *= self.learning_rate
# calculate input->hidden deltas
inputs_t = inputs.transpose()
#multiplys hidden_gradient and input Transpose
weight_ih_deltas = np.zeros(((np.size(hidden_gradient, 1)), (np.size(inputs_t, 0))))
weight_ih_deltas = np.dot(hidden_gradient, inputs_t)
self.weights_ih += weight_ih_deltas
# adjust the bias by its deltas (which is the gradient)
self.bias_h += hidden_gradient