Память, кажется, нужно очистить перед повторной тренировкой?

Я запускал алгоритм 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)

Извините за весь код. Но я постарался дать как можно больше информации.

Но есть ли причина, по которой установка, которая обычно обучалась, прерывается до запуска отдельной установки, а затем снова начинает работать?

*** Обновление. Я могу запустить неизмененную установку с моим измененным кодом, а измененный, который не работает, также предотвращает работу неизмененного кода при одновременном запуске!!!

0 ответов

Другие вопросы по тегам