def train(hidden, output, sampling_points): """Train the given layers.""" print('Training...') last_training_run = np.zeros(NUM_SAMPLES) last_training_errors = np.zeros(NUM_SAMPLES) for epoch in range(NUM_EPOCHS): current_index = epoch % NUM_SAMPLES next_index = (current_index + 1) % NUM_SAMPLES if epoch % (20 * NUM_SAMPLES) == 0: # change training frequency frequency_factor = float(np.random.random_integers(NUM_TRAINING_FREQUENCIES)) sine_input = np.sin(frequency_factor * sampling_points) frequency_input = [frequency_factor] * NUM_SAMPLES input_data = np.insert( frequency_input, range(NUM_SAMPLES), sine_input ).reshape(NUM_SAMPLES, 2) hidden.clear() # process inputs outputs = output.process(hidden.process(input_data[current_index])) # backpropagate errors output.errors = sine_input[next_index] - outputs hidden.errors.appendleft(expit_prime(hidden.h[0]) * np.dot(output.errors, output.weights)) for index in range(1, len(hidden.errors)): hidden.errors[index] = expit_prime(hidden.h[index]) * np.dot(hidden.errors[index-1], hidden.recurrent_weights) # learn output.update() hidden.update() # log last run if epoch >= (NUM_EPOCHS - NUM_SAMPLES): last_training_run[next_index] = outputs last_training_errors[next_index] = output.errors return sine_input, last_training_run, last_training_errors
hidden = Layer(NUM_HIDDEN_NODES, input_data.shape[0], expit) output = Layer(len(input_files), NUM_HIDDEN_NODES, softmax) average_errors = np.ones(len(input_files)) accepted_errors = np.full(len(input_files), ACCEPTED_ERROR) while not np.all(np.less(average_errors, accepted_errors)): # get a random date input_data, expected_value = get_input_data(input_files) # process inputs outputs = output.process(hidden.process(input_data)) # calculate errors output.errors = expected_value - outputs hidden.errors = expit_prime(hidden.h) * np.dot(output.errors, output.weights) # update weights and biases output.update() hidden.update() average_errors = update_ema(output.errors, average_errors) print('last errors:\n', output.errors) print('last outputs:\n', outputs) print('last outputs rounded:\n', outputs.round()) #index = expected_value.nonzero()[0][0] #print('index of class:', index) #print('output of class:', outputs[index]) #print('error for class:', output.errors[index])