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