使用GradientTape优化后的Tensorflow强化学习RNN返回NaN

问题描述 投票:1回答:1
def create_example_model():
    tf.keras.backend.set_floatx('float64')
    model = Sequential()
    model.add(LSTM(128, input_shape=((60, len(df_train.columns)))))

    model.add(Dense(64, activation='relu'))

    model.add(Dense(3, activation=None))

    return model

def choose_action(model, observation):
    observation = np.expand_dims(observation, axis=0)

    logits = model.predict(observation)

    prob_weights = tf.nn.softmax(logits).numpy()

    action = np.random.choice(3, size=1, p=prob_weights.flatten())[0]

    return action

def train_step(model, optimizer, observations, actions, discounted_rewards):
    with tf.GradientTape() as tape:

        logits = model(observations)

        loss = compute_loss(logits, actions, discounted_rewards)

        grads = tape.gradient(loss, model.trainable_variables)
        optimizer.apply_gradients(zip(grads, model.trainable_variables))

learning_rate = 1e-3
optimizer = tf.keras.optimizers.Adam(learning_rate)
env = TradingEnv(rnn_ready_array)

model = create_example_model()
memory = Memory()
info_list = []

for i_episode in range(10):
    observation = env.reset()
    memory.clear()

    while True:
        action = choose_action(model, observation)
        next_observation, reward, done, info = env.step(action)
        info_list.append(info)
        memory.add_to_memory(observation, action, reward)
        if done:
            total_reward = sum(memory.rewards)
            train_step(model, optimizer,
                 observations=np.array(memory.observations),
                 actions=np.array(memory.actions),
                 discounted_rewards = discount_rewards(memory.rewards))

            memory.clear()
            break
        observation = next_observation

我正在使用Tensorflow 2.0进行强化学习项目;代码格式来自在线MIT课程,我正在尝试使其适应我自己的项目。我是Tensorflow 2.0的新手,我无法从文档中了解为什么会出现此问题。问题是,当我运行强化学习过程时,

  1. 第一集将永远成功完成。
  2. 将始终成功地从模型中生成新的观察值。
  3. 在第二集期间,网络将始终输出:[NaN,NaN,NaN]

我发现一些调试信息应该会有所帮助:如果我注释掉优化行“ grads = tape.gradient(...)”和“ optimizer.apply_gradients(...)”,脚本将无错误地运行到完成状态(尽管如果不进行优化,显然它不会做任何有用的事情) 。这对我来说表明优化过程正在以导致问题的方式更改模型。我试图只包括调试所需的功能;如果还有其他可能需要调试的信息,我很乐意在编辑中添加其他信息。

python deep-learning tensorflow2.0 recurrent-neural-network reinforcement-learning
1个回答
0
投票

[经过数小时的检查和重新检查各种容器后,我意识到这是折扣奖励功能无法正常工作,在这种情况下返回了NaN。问题已解决:)

© www.soinside.com 2019 - 2024. All rights reserved.