PyTorch遗传算法复制最优模型后所有个体变异参数相同如何解决
问题根因
你当前的种群填充代码只是把同一个best_model对象的引用重复加入列表,整个种群列表的所有元素都指向内存中同一个模型实例,对任意一个元素的修改都会同步作用到所有其他元素上,这就是变异后所有模型参数完全一致的原因。
修复方案
需要每次添加最优模型时,独立生成一个参数和最优模型完全一致的新实例,也就是对模型做深拷贝:
- 导入Python标准库的
copy模块 - 把种群填充的代码行替换为深拷贝版本
修改后的完整可运行代码如下:
import torch import torch.nn as nn import copy # 新增导入 torch.manual_seed(0) # 保证可复现 population_size = 3 population = [nn.Linear(1,1) for _ in range(population_size)] input = torch.rand(1) def mutate(m): 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)) best_model = population[0] # 替换原来的种群填充行,每次都深拷贝生成独立的新模型 population = [copy.deepcopy(best_model) for _ in range(population_size)] # 此时变异每个模型都是独立操作不同的实例 population = [x.apply(mutate) for x in population] print ('\n') for i in population: print (i(input)) # 三个输出会各不相同,符合预期
运行修改后的代码,最后一步打印的三个结果会互不相同,说明每个模型已经可以独立变异。
内容的提问来源于stack exchange,提问作者Cmark
相关产品推荐
相关产品推荐

