【发布时间】:2019-01-18 10:20:13
【问题描述】:
最近我一直在尝试使用前馈神经网络在 Python 中创建一个进化模拟器。除了复制功能外,一切正常。
起初,在开发繁殖时,我只是简单地调用了一个函数,该函数创建了一个新的动物对象,该对象具有与其父母所具有的相同但略有变异的属性。例如,我通过写parent.weights = child.weights 来做到这一点。然而,我了解到这只会创建对父母权重的引用,因此孩子并不独立于其父母。因此,例如,每当一个孩子改变其体重时,所有其他具有参考体重的动物也会发生变化,从而导致整个人群的行为突然发生类似的变化。
后来我发现了 Python 的 copy 库。现在要创建一个子动物,我使用copy.deepcopy() 复制父级的整个对象,然后更改复制的对象以创建子级。这工作了一段时间,但在运行程序大约一个小时后,它太慢了,无法取得任何进展。我发现当一个孩子出生时,如果做了一个深拷贝,程序会完全停止,并且一次加载几秒钟。
我不知道这是什么原因造成的,但我有点怀疑这可能是某种内存泄漏。我的问题是:
这可能是什么原因?
是否有任何解决方案或替代方法来创建 没有引用的对象?
这是相关的副本,简化版:
调用再现函数:
#asexual reproduction
if self.energy > (((pow(self.sizeRadius, 2) * 3.14 ))):
self.birthed_kin += 1
self.energy -= (pow(self.sizeRadius, 2) * 3.14 ) / 2
self.birth_timer = 0
self.copy_animal()
再现功能:
def copy_animal(self):
copied_animal = copy.deepcopy(self)
copied_animal.age = 0
copied_animal.birthed_kin = 0
copied_animal.sizeRadius = mutate_organ(copied_animal.sizeRadius, 1)
copied_animal.energy = (pow(copied_animal.sizeRadius, 2) * 3.14) / 2
copied_animal.health = pow(copied_animal.sizeRadius, 2) * 3.14
copied_animal.pain = 0
copied_animal.weights = [
mutate_neuralnetwork( copied_animal, copied_animal.input_size, copied_animal.hidden_sizes[0], copied_animal.weights[0], copied_animal.mutation_rate),
mutate_neuralnetwork( copied_animal, copied_animal.hidden_sizes[0], copied_animal.output_size, copied_animal.weights[1], copied_animal.mutation_rate),
]
living_animals_array.append(copied_animal)
如果我应该分享更多代码或详细信息,请告诉我。
【问题讨论】:
标签: python memory-leaks neural-network copy deep-copy