Как я могу быстро изменить вес нейросети тензорного потока / кераса? - PullRequest
0 голосов
/ 08 июля 2019

Я обучил игровую нейронную сеть через контролируемое обучение с использованием тензорного потока и кера и теперь хочу, чтобы она улучшалась сама по себе. Моя стратегия на данный момент состоит в том, чтобы клонировать модель, применить некоторые мутации и заставить ее играть самому с победителем, "оставаясь включенным".

Проблема заключается в мутировании сети, требующей давности. У него 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 массивов (каждый из которых имеет различную форму), поэтому я использовал неудобную рекурсивную функцию.

(Бонусные вопросы) Есть ли лучший способ обучить существующую нейронную сеть keras / tf через самостоятельную игру? Из того, что я прочитал, кажется, что самостоятельное воспроизведение не совсем соответствует их предназначению.

...