dqn在训练过程中loss越来越大_强化学习笔记:OpenAI Gym+DQN+Tensorflow2实现

这篇博客详细介绍了使用DQN算法在OpenAI Gym的CartPole环境中进行强化学习的过程。文章涵盖代码框架、主循环、单局游戏、自定义奖励和TensorBoard可视化等关键部分。作者通过调整DQN,如增加每局内总奖励和损失的记录,使用自定义奖励函数以提升训练效率。此外,还探讨了在训练过程中损失(loss)逐渐增大的原因和可能的解决方案,强调了奖励函数设计的重要性。
摘要由CSDN通过智能技术生成

de6dd99a01f09530dcc6609d6fb67bda.png
参考了一些文章,针对OpenAI gym环境,使用tf2.x实现了DQN算法;加上了一些没有太大必要(?)的小功能,比如:自动保存视频,保存训练日志从而利用TensorBoard实现数据可视化,保存和读取训练记忆,保存和读取DQN权重。适用于CartPole环境,只需少量改动也可以用于MountainCar环境。代码下载及本文参考见文末。

本篇目录

  • 代码框架
    • 主循环
    • 单局游戏
    • 自定义reward
    • 自动录制视频
  • DQN算法主体
    • 神经网络
    • DQN
    • 效果
    • TensorBoard可视化
    • 关于Reward
  • 代码下载
  • 参考

CartPole环境

03851f584b3395f6af9294ce18f429db.gif

代码框架

主循环

-------------初始化---------------
- 创建Gym环境实例
- 设置DQN参数
- 创建DQN实例
  - 载入DQN记忆(可选)
  - 载入DQN权重(可选)
- 创建tensorflow summary writer
- 设置训练参数
--------------训练----------------
- 循环N次
|     运行一局,得到该局内的reward和losses
|     记录数据到summary
|     显示数据到命令行
- 结束循环
--------------结束----------------
  - 保存DQN记忆
  - 保存DQN权重
  - 录制视频
- 关闭环境

代码:

from cart_pole import MyModel
from cart_pole import DQN
from cart_pole import play_game
from cart_pole import make_video

import numpy as np
import tensorflow as tf
import gym
import os
import datetime
from statistics import mean
from gym import wrappers

def main():
    ####################初始化#####################

    env = gym.make('CartPole-v0')
    gamma = 0.9
    num_states = len(env.observation_space.sample())
    num_actions = env.action_space.n
    hidden_units = [20, 20]
    max_experiences = 2000
    min_experiences = 1000
    batch_size = 32
    lr = 0.01
    e_greedy = 0.9
    e_greedy_increment = 1.001
    replace_target_iter = 50

    DQN_ = DQN(num_states, num_actions, hidden_units, gamma, max_experiences, 
            min_experiences, batch_size, lr,e_greedy, replace_target_iter,e_greedy_increment)

    DQN_.loadModel()
    DQN_.loadMemory()
    
    current_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
    log_dir = 'logs/dqn/' + current_time
    summary_writer = tf.summary.create_file_writer(log_dir)

    N = 10000 # 总训练轮次
    Dispaly_interval = 100
    total_rewards = np.empty(N)
 
    ####################主循环#####################
    for n in range(N):
        total_reward, losses = play_game(env, DQN_)
        total_rewards[n] = total_reward
        avg_rewards = total_rewards[max(0, n - Dispaly_interval):(n + 1)].mean()
        with summary_writer.as_default():
            tf.summary.scalar('episode reward', total_reward, step=n)
            tf.summary.scalar('running avg reward(100)', avg_rewards, step=n)
            tf.summary.scalar('average loss)', losses, step=n)
        if n % Dispaly_interval == 0:
            print("episode:", n, "eps:", DQN_.epsilon, "avg reward (last ",Dispaly_interval,"):", avg_rewards,
                  "episode loss: ", losses)


    ####################结束##############
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值