我已经使用tensorflow和keras通过监督学习训练了一个玩游戏的神经网络,现在想让它自己玩以改善。目前,我的策略是克隆模型,应用一些变异并使其与获胜者“继续”合作。
问题在于更改网络需要很长时间。它具有84'000'000可训练的权重,而要使它们发生变异大约需要7秒钟。
def gen_mutant(parent_model, mutation_rate):
new_weights = parent_model.get_weights()
for weight_array in new_weights:
num_weights = weight_array.size
num_weights_modified = np.random.binomial(num_weights, mutation_rate)
for i in range(num_weights_modified):
modify_weights(weight_array)
mutant = tf.keras.models.clone_model(parent_model)
mutant.set_weights(new_weights)
return mutant
def modify_weights(weight_val):
if np.isscalar(weight_val):
np.random.normal(weight_val, abs(weight_val / 2))
else:
array_n = random.randint(0, len(weight_val)-1)
modify_weights(weight_val[array_n])
有什么我可以做以加快这一过程的吗? parent_model.get_weights()
的结构是6个numpy数组(每个都有不同形状)的列表,这就是为什么我使用了笨拙的递归函数。
(奖励问题) 是否有更好的方法通过自学训练现有的keras / tf神经网络?根据我的阅读,似乎自娱自乐与他们的预期用途不符。