Память, кажется, нужно очистить перед повторной тренировкой?
Я запускал алгоритм trpo_mpi на OpenAI Ant-v2 в baselines-tf2 и большую часть времени получал хорошие результаты. Но кажется, что всякий раз, когда я делаю определенные модификации в обучаемой модели или манипулирую весами в trpo_mpi.py, что-то ломается, и она перестает тренироваться, независимо от того, сколько еще итераций по времени повторяются. Более того, перестают работать экземпляры, которые обычно прошли бы обучение. Затем я запущу совершенно другую установку программы по умолчанию, которая, кажется, имеет какой-то эффект очистки памяти, перезапущу первую установку с некоторыми аналогичными изменениями, как и раньше, и все начнет работать.
Вот модель по умолчанию (плюс некоторые незначительные изменения, которые, я думаю, ни на что не повлияли) в baselines-tf2/common.models.py:
def network_fn(input_shape):
##################################################################################################
# input_shape = (27,) - for Ant-v2
print('input shape is {}'.format(input_shape))
x_input = tf.keras.Input(shape=input_shape)
# h = tf.keras.layers.Flatten(x_input)
h = x_input
for i in range(num_layers):
h = tf.keras.layers.Dense(units=num_hidden, kernel_initializer=ortho_init(np.sqrt(2)),
name='mlp_fc{}'.format(i), activation=activation)(h)
network = tf.keras.Model(inputs=[x_input], outputs=[h])
return network
shape = (27,)
network = network_fn(shape) # FOR Ant-v2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return network_fn, network
А вот обновленная модель, которую я начал использовать:
def network_fn(input_shape): # Fractal TEST 2.0
##################################################################################################
# input_shape = (27,) - for Ant-v2
print('input shape is {}'.format(input_shape))
x_input = tf.keras.Input(shape=input_shape)
# h = tf.keras.layers.Flatten(x_input)
h1 = x_input
h1 = tf.keras.layers.Dense(units=64, kernel_initializer=ortho_init(np.sqrt(2)),
name='dense_top_0'.format(0), activation=activation)(h1)
h1 = tf.keras.layers.Dense(units=63, kernel_initializer=ortho_init(np.sqrt(2)),
name='dense_top_1'.format(1), activation=activation)(h1)
h2 = x_input
h2 = tf.keras.layers.Dense(units=64, kernel_initializer=ortho_init(np.sqrt(2)),
name='dense_bot_0'.format(2), activation=activation)(h2)
h2 = tf.keras.layers.Dense(units=63, kernel_initializer=ortho_init(np.sqrt(2)),
name='dense_bot_1'.format(3), activation=activation)(h2)
h3 = tf.keras.layers.concatenate([h1,h2])
h4 = tf.keras.layers.Dense(units=8, kernel_initializer=ortho_init(np.sqrt(2)),
name='dense_out'.format(4), activation=activation)(h3)
# network = tf.keras.Model(inputs=[x_input], outputs=[h3])
network = tf.keras.Model(inputs=[x_input], outputs=[h4])
return network
shape = (27,)
network = network_fn(shape) # FOR Ant-v2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# print(network.summary())
# pol_weights_bias_0 = network.get_layer('dense_0').get_weights()
# print('weights_bias')
# print(pol_weights_bias_0)
# input('')
return network_fn, network
Вот одна функция, которая обновляет веса, которые я создал и использовал в policy.py, который вызывается в trpo_mpi.py
def kill_actions(self):
# Successfully kills self.mean in DiagGaussianPd(Pd).sample() in distributions.py
# Fractal test 2.0 (it's really just a duplicated NN)
# Locking actions for bottom network
pol_w_bot2 = self.policy_network.get_layer('dense_bot_0'.format(2)).get_weights()[0]
pol_b_bot2 = self.policy_network.get_layer('dense_bot_0'.format(2)).get_weights()[1]
val_w_bot2 = self.value_network.get_layer('dense_bot_0'.format(2)).get_weights()[0]
val_b_bot2 = self.value_network.get_layer('dense_bot_0'.format(2)).get_weights()[1]
pol_w_bot3 = self.policy_network.get_layer('dense_bot_1'.format(3)).get_weights()[0]
pol_b_bot3 = self.policy_network.get_layer('dense_bot_1'.format(3)).get_weights()[1]
val_w_bot3 = self.value_network.get_layer('dense_bot_1'.format(3)).get_weights()[0]
val_b_bot3 = self.value_network.get_layer('dense_bot_1'.format(3)).get_weights()[1]
pol_w_bot2 = pol_w_bot2*0
pol_b_bot2 = pol_b_bot2*0
val_w_bot2 = val_w_bot2*0
val_b_bot2 = val_b_bot2*0
pol_w_bot3 = pol_w_bot3*0
pol_b_bot3 = pol_b_bot3*0
val_w_bot3 = val_w_bot3*0
val_b_bot3 = val_b_bot3*0
self.policy_network.get_layer('dense_bot_0'.format(2)).set_weights([pol_w_bot2,pol_b_bot2])
self.value_network.get_layer('dense_bot_0'.format(2)).set_weights([val_w_bot2,val_b_bot2])
self.policy_network.get_layer('dense_bot_1'.format(3)).set_weights([pol_w_bot3,pol_b_bot3])
self.value_network.get_layer('dense_bot_1'.format(3)).set_weights([val_w_bot3,val_b_bot3])
И другая функция, которая манипулирует весами:
def hold_weights(self):
# Fractal test 1.0
# Hold the top weights to what they were saved at after phase 1
pol_w_b_top0 = np.load('pol_weights_bias_top_0.npy',allow_pickle=True)
val_w_b_top0 = np.load('val_weights_bias_top_0.npy',allow_pickle=True)
pol_w_b_top1 = np.load('pol_weights_bias_top_1.npy',allow_pickle=True)
val_w_b_top1 = np.load('val_weights_bias_top_1.npy',allow_pickle=True)
self.policy_network.get_layer('dense_top_0'.format(0)).set_weights(pol_w_b_top0)
self.value_network.get_layer('dense_top_0'.format(0)).set_weights(val_w_b_top0)
self.policy_network.get_layer('dense_top_1'.format(1)).set_weights(pol_w_b_top1)
self.value_network.get_layer('dense_top_1'.format(1)).set_weights(val_w_b_top1)
# Set bottom weights to 0.5 of what they were going to be set at
# Fractal test 2.0
pol_w_bot0 = self.policy_network.get_layer('dense_bot_0'.format(2)).get_weights()[0]
pol_b_bot0 = self.policy_network.get_layer('dense_bot_0'.format(2)).get_weights()[1]
val_w_bot0 = self.value_network.get_layer('dense_bot_0'.format(2)).get_weights()[0]
val_b_bot0 = self.value_network.get_layer('dense_bot_0'.format(2)).get_weights()[1]
pol_w_bot1 = self.policy_network.get_layer('dense_bot_1'.format(3)).get_weights()[0]
pol_b_bot1 = self.policy_network.get_layer('dense_bot_1'.format(3)).get_weights()[1]
val_w_bot1 = self.value_network.get_layer('dense_bot_1'.format(3)).get_weights()[0]
val_b_bot1 = self.value_network.get_layer('dense_bot_1'.format(3)).get_weights()[1]
pol_w_bot0 = pol_w_bot0*0.5
pol_b_bot0 = pol_b_bot0*0.5
val_w_bot0 = val_w_bot0*0.5
val_b_bot0 = val_b_bot0*0.5
pol_w_bot1 = pol_w_bot1*0.5
pol_b_bot1 = pol_b_bot1*0.5
val_w_bot1 = val_w_bot1*0.5
val_b_bot1 = val_b_bot1*0.5
self.policy_network.get_layer('dense_bot_0'.format(2)).set_weights([pol_w_bot0,pol_b_bot0])
self.value_network.get_layer('dense_bot_0'.format(2)).set_weights([val_w_bot0,val_b_bot0])
self.policy_network.get_layer('dense_bot_1'.format(3)).set_weights([pol_w_bot1,pol_b_bot1])
self.value_network.get_layer('dense_bot_1'.format(3)).set_weights([val_w_bot1,val_b_bot1])
Наконец, вот код, который я использовал сразу после выхода программы из функции "обучения" в trpo_mpi.py для сохранения весов.
pol_weights_bias_top_0 = pi_policy_network.get_layer('dense_top_0'.format(0)).get_weights()
val_weights_bias_top_0 = pi_value_network.get_layer('dense_top_0'.format(0)).get_weights()
pol_weights_bias_top_1 = pi_policy_network.get_layer('dense_top_1'.format(1)).get_weights()
val_weights_bias_top_1 = pi_value_network.get_layer('dense_top_1'.format(1)).get_weights()
np.save('pol_weights_bias_top_0.npy'.format(0),pol_weights_bias_top_0)
np.save('val_weights_bias_top_0.npy'.format(0),val_weights_bias_top_0)
np.save('pol_weights_bias_top_1.npy'.format(1),pol_weights_bias_top_1)
np.save('val_weights_bias_top_1.npy'.format(1),val_weights_bias_top_1)
а также
pol_weights_bias_top_0 = pi_policy_network.get_layer('dense_top_0'.format(0)).get_weights()
val_weights_bias_top_0 = pi_value_network.get_layer('dense_top_0'.format(0)).get_weights()
pol_weights_bias_top_1 = pi_policy_network.get_layer('dense_top_1'.format(1)).get_weights()
val_weights_bias_top_1 = pi_value_network.get_layer('dense_top_1'.format(1)).get_weights()
np.save('pol_weights_bias_top_0_p2.npy'.format(0),pol_weights_bias_top_0)
np.save('val_weights_bias_top_0_p2.npy'.format(0),val_weights_bias_top_0)
np.save('pol_weights_bias_top_1_p2.npy'.format(1),pol_weights_bias_top_1)
np.save('val_weights_bias_top_1_p2.npy'.format(1),val_weights_bias_top_1)
pol_weights_bias_bot_0 = pi_policy_network.get_layer('dense_bot_0'.format(2)).get_weights()
val_weights_bias_bot_0 = pi_value_network.get_layer('dense_bot_0'.format(2)).get_weights()
pol_weights_bias_bot_1 = pi_policy_network.get_layer('dense_bot_1'.format(3)).get_weights()
val_weights_bias_bot_1 = pi_value_network.get_layer('dense_bot_1'.format(3)).get_weights()
np.save('pol_weights_bias_bot_0_p2.npy'.format(2),pol_weights_bias_bot_0)
np.save('val_weights_bias_bot_0_p2.npy'.format(2),val_weights_bias_bot_0)
np.save('pol_weights_bias_bot_1_p2.npy'.format(3),pol_weights_bias_bot_1)
np.save('val_weights_bias_bot_1_p2.npy'.format(3),val_weights_bias_bot_1)
Извините за весь код. Но я постарался дать как можно больше информации.
Но есть ли причина, по которой установка, которая обычно обучалась, прерывается до запуска отдельной установки, а затем снова начинает работать?
*** Обновление. Я могу запустить неизмененную установку с моим измененным кодом, а измененный, который не работает, также предотвращает работу неизмененного кода при одновременном запуске!!!