Невозможно использовать сохраненную модель в качестве отправной точки для обучения MlpPolicy Baselines? - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время я использую код из базовых линий OpenAI для обучения модели, используя следующий код в моем train.py:

from baselines.common import tf_util as U
import tensorflow as tf
import gym, logging

from visak_dartdeepmimic import VisakDartDeepMimicArgParse

def train(env, initial_params_path,
        save_interval, out_prefix, num_timesteps, num_cpus):
    from baselines.ppo1 import mlp_policy, pposgd_simple
    sess = U.make_session(num_cpu=num_cpus).__enter__()

    U.initialize()

    def policy_fn(name, ob_space, ac_space):
        print("Policy with name: ", name)
        policy = mlp_policy.MlpPolicy(name=name, ob_space=ob_space, ac_space=ac_space,
            hid_size=64, num_hid_layers=2)
        saver = tf.train.Saver()
        if initial_params_path is not None:
            print("Tried to restore from ", initial_params_path)
            saver.restore(tf.get_default_session(), initial_params_path)
        return policy

    def callback_fn(local_vars, global_vars):
        iters = local_vars["iters_so_far"]
        saver = tf.train.Saver()
        if iters % save_interval == 0:
            saver.save(sess, out_prefix + str(iters))

    pposgd_simple.learn(env, policy_fn,
            max_timesteps=num_timesteps,
            callback=callback_fn,
            timesteps_per_actorbatch=2048,
            clip_param=0.2, entcoeff=0.0,
            optim_epochs=10, optim_stepsize=3e-4, optim_batchsize=64,
            gamma=1.0, lam=0.95, schedule='linear',
        )
    env.close()

, который основан на коде, который сам OpenAI предоставляет в репозитории baselines

Это отлично работает, за исключением того, что я получаю довольно странные кривые обучения, которые, я подозреваю, связаны с некоторыми гиперпараметрами, переданными в функцию learn, которые приводят к снижению производительности / высокой дисперсиипо ходу дела (хотя я не знаю наверняка)

enter image description here

В любом случае, чтобы подтвердить эту гипотезу, я хотел бы переучить модель, ноне с нуля: я хотел бы начать с высокой точки: скажем, итерация 1600, для которой у меня есть сохраненная модель (сохранив ее с saver.save в callback_fn

Так что теперьЯ вызываю функцию train, но на этот раз я предоставляю ей inital_params_path, указывающий на префикс сохранения для итерации 1600. Насколько я понимаю, вызов saver.restore в policy_fn должен восстановить «сброс» модели допорогаЭто было на 1-й версии 1600 (и я подтвердил, что процедура загрузки выполняется с использованием оператора print)

Однако на практике я обнаружил, что почти ничего не загружается.Например, если я получил статистику, такую ​​как

----------------------------------
| EpLenMean       | 74.2         |
| EpRewMean       | 38.7         |
| EpThisIter      | 209          |
| EpisodesSoFar   | 662438       |
| TimeElapsed     | 2.15e+04     |
| TimestepsSoFar  | 26230266     |
| ev_tdlam_before | 0.95         |
| loss_ent        | 2.7640965    |
| loss_kl         | 0.09064759   |
| loss_pol_entpen | 0.0          |
| loss_pol_surr   | -0.048767302 |
| loss_vf_loss    | 3.8620138    |
----------------------------------

для итерации 1600, то для итерации 1 нового испытания (якобы используя параметры 1600 в качестве отправной точки), я получаю что-то вроде

----------------------------------
| EpLenMean       | 2.12         |
| EpRewMean       | 0.486        |
| EpThisIter      | 7676         |
| EpisodesSoFar   | 7676         |
| TimeElapsed     | 12.3         |
| TimestepsSoFar  | 16381        |
| ev_tdlam_before | -4.47        |
| loss_ent        | 45.355236    |
| loss_kl         | 0.016298374  |
| loss_pol_entpen | 0.0          |
| loss_pol_surr   | -0.039200217 |
| loss_vf_loss    | 0.043219414  |
----------------------------------

, который возвращается на круги своя (это где-то там, где мои модели обучаются с нуля)

Самое смешное, что я знаю, что модель, по крайней мере, сохраняется должным образом, поскольку я могу фактически воспроизвести ее, используяeval.py

from baselines.common import tf_util as U
from baselines.ppo1 import mlp_policy, pposgd_simple
import numpy as np
import tensorflow as tf

class PolicyLoaderAgent(object):
    """The world's simplest agent!"""
    def __init__(self, param_path, obs_space, action_space):
        self.action_space = action_space

        self.actor = mlp_policy.MlpPolicy("pi", obs_space, action_space,
                                        hid_size = 64, num_hid_layers=2)
        U.initialize()
        saver = tf.train.Saver()
        saver.restore(tf.get_default_session(), param_path)

    def act(self, observation, reward, done):
        action2, unknown = self.actor.act(False, observation)
        return action2


if __name__ == "__main__":

    parser = VisakDartDeepMimicArgParse()
    parser.add_argument("--params-prefix", required=True, type=str)
    args = parser.parse_args()
    env = parser.get_env()

    U.make_session(num_cpu=1).__enter__()

    U.initialize()

    agent = PolicyLoaderAgent(args.params_prefix, env.observation_space, env.action_space)

    while True:
        ob = env.reset(0, pos_stdv=0, vel_stdv=0)
        done = False
        while not done:
            action = agent.act(ob, reward, done)
            ob, reward, done, _ = env.step(action)
            env.render()

и я ясно вижу, что это чему-то научилось по сравнению с неподготовленным базовым уровнем.Действие загрузки одинаково для обоих файлов (точнее, если там есть ошибка, то я не могу ее найти), поэтому мне представляется вероятным, что train.py правильно загружает модель, а затем, из-за чего-то вpposdg_simple.learn Функция , быстро забывает об этом.

Может ли кто-нибудь пролить свет на эту ситуацию?

1 Ответ

0 голосов
/ 19 марта 2019

Не уверен, что это все еще актуально, так как хранилище базовых показателей сильно изменилось с момента публикации этого вопроса, но кажется, что вы фактически не инициализируете переменные перед их восстановлением. Попробуйте переместить вызов U.initialize() внутрь вашего policy_fn:

def policy_fn(name, ob_space, ac_space):
    print("Policy with name: ", name)    
    policy = mlp_policy.MlpPolicy(name=name, ob_space=ob_space, 
                                  ac_space=ac_space, hid_size=64, num_hid_layers=2)
    saver = tf.train.Saver()
    if initial_params_path is not None:  
        print("Tried to restore from ", initial_params_path)
        U.initialize()
        saver.restore(tf.get_default_session(), initial_params_path)
    return policy
...