如何快速改变张量流/ keras神经网络的权重?

时间:2019-07-08 14:50:23

标签: tensorflow machine-learning keras neural-network evolutionary-algorithm

我已经使用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神经网络?根据我的阅读,似乎自娱自乐与他们的预期用途不符。

0 个答案:

没有答案