#!/usr/bin/env python """Entry point to evolving the neural network. Start here.""" from __future__ import print_function from evolver import Evolver from tqdm import tqdm import logging import sys # Setup logging. logging.basicConfig( format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.INFO, filename='log.txt' ) def train_genomes(genomes): """Train each genome. Args: networks (list): Current population of genomes """ logging.info("***train_networks(networks)***") pbar = tqdm(total=len(genomes)) for genome in genomes: genome.train() pbar.update(1) pbar.close() def get_average_accuracy(genomes): """Get the average accuracy for a group of networks/genomes. Args: networks (list): List of networks/genomes Returns: float: The average accuracy of a population of networks/genomes. """ total_accuracy = 0 for genome in genomes: total_accuracy += genome.accuracy return total_accuracy / len(genomes) def generate(generations, population, all_possible_genes): """Generate a network with the genetic algorithm. Args: generations (int): Number of times to evolve the population population (int): Number of networks in each generation all_possible_genes (dict): Parameter choices for networks """ logging.info("***generate(generations, population, all_possible_genes)***") evolver = Evolver(all_possible_genes) genomes = evolver.create_population(population) # Evolve the generation. for i in range( generations ): logging.info("***Now in generation %d of %d***" % (i + 1, generations)) print_genomes(genomes) # Train and get accuracy for networks/genomes. train_genomes(genomes) # Get the average accuracy for this generation. average_accuracy = get_average_accuracy(genomes) # Print out the average accuracy each generation. logging.info("Generation average: %.2f%%" % (average_accuracy * 100)) logging.info('-'*80) #----------- # Evolve, except on the last iteration. if i != generations - 1: # Evolve! genomes = evolver.evolve(genomes) # Sort our final population according to performance. genomes = sorted(genomes, key=lambda x: x.accuracy, reverse=True) # Print out the top 5 networks/genomes. print_genomes(genomes[:5]) #save_path = saver.save(sess, '/output/model.ckpt') #print("Model saved in file: %s" % save_path) def print_genomes(genomes): """Print a list of genomes. Args: genomes (list): The population of networks/genomes """ logging.info('-'*80) for genome in genomes: genome.print_genome() def main(): """Evolve a genome.""" population = 20 # Number of networks/genomes in each generation. #we only need to train the new ones.... generations = 2 # Number of times to evolve the population. all_possible_genes = { 'nb_neurons': [8, 16, 32, 64, 128, 256, 512, 1024], 'nb_layers': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'activation': ['relu', 'elu', 'tanh', 'sigmoid', 'hard_sigmoid','softplus','linear'], #'optimizer': ['rmsprop', 'adam', 'sgd', 'adagrad','adadelta', 'adamax', 'nadam'] 'lr': [0.01, 0.05, 0.1, 0.2, 0.3, 0.5, 1.0, 10.0, 100.0], 'decay': [1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7], 'momentum': [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] } print("***Evolving for %d generations with population size = %d***" % (generations, population)) generate(generations, population, all_possible_genes) if __name__ == '__main__': main()