the final task-specific routings is returned to CoDeepNEAT and attributed to the modules in the same way as in CM: Each module is assigned the mean of the fitnesses of all the CTR runs that made use of that module. Another way to characterize CMTR is that it overcomes the weaknesses in both CM and CTR: CM’s inability to create a customized routing for each task and CTR’s inability to search for better module architectures.

CMTR’s evolutionary loop works as follows:

1.  \[CMTR:zero\] CoDeepNEAT initializes a population of modules $MP$. The blueprints are not used.

2.  Modules are randomly chosen from each species in $MP$ and grouped together into sets of modules $M_k$.

3.  Each set of modules $M_k$ is given to CTR, which assembles the modules by evolving task-specific routings. The performance of the evolved routings on a task is returned as fitness.

4.  Fitness is attributed to the modules, and NEAT’s evolutionary operators applied to evolve the modules.

5.  The process repeats from step \[CMTR:zero\] until CoDeepNEAT terminates, i.e. no improvement for a given number of generations.

One difference between CMTR and CM is that each module’s final convolutional layer has additional evolvable hyperparameters such as kernel size, 