Каждая из моих моделей генетического алгоритма мутирует одинаково

#python #python-3.x #pytorch #genetic-algorithm

Вопрос:

Я работал над генетическим алгоритмом, в котором я пытаюсь взять лучшую модель моей популяции (на основе оценки) и превратить всю популяцию в эту модель. Я сделал это успешно, но когда я пытаюсь мутировать каждую модель отдельно, все модели мутируют с одинаковыми параметрами. Я знаю, что это потому, что я использую объект и просто клонирую его в список, но я не знаю, что изменить, чтобы он не работал таким образом. Ниже я привел воспроизводимый пример для запуска в Python 3.9. Я знаю, что код не особенно мал, но это все, что я могу сделать. Заранее спасибо, любая помощь будет признательна.

 import torch
import torch.nn as nn

torch.manual_seed(0) #Reproducibility

population_size = 3 #Defining the size of my population
population = [nn.Linear(1,1) for _ in range(population_size)] #Initializing the population
input = torch.rand(1)# Creating dummy input
def mutate(m): #Function to mutate a model
    if type(m) == nn.Linear:
        m.weight = nn.Parameter(m.weight torch.randn(m.weight.shape))
        m.bias = nn.Parameter(m.bias torch.randn(m.bias.shape))

for i in population:
    print (i(input))

population = [x.apply(mutate) for x in population]

print ('n')

for i in population:
    print (i(input))
#The above works as expected

#I want to fill my entire population with that model.
#I've been filling the population with the best model by doing the following:

best_model = population[0] #Say the first model in the list was the best performing one

population = [best_model for _ in range(population_size)] #This is the line I think needs to change, I just don't know what to change it to. 

#This does fill the population with my best model, but when I try to mutate it, every model is mutated to the same parameters

population = [x.apply(mutate) for x in population] #I know this is because I am using best_model while replacing the population, but I don't know how else to copy the model

for i in population:
    print (i(input)) #Just to show that the population all gives the same result
 

Ответ №1:

Вы можете сделать глубокую копию модели. Убедитесь в import copy этом , а затем измените

 population = [best_model for _ in range(population_size)]
 

Для

 population = [copy.deepcopy(best_model) for _ in range(population_size)]
 

Комментарии:

1. Отлично, спасибо!