国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法

這篇具有很好參考價值的文章主要介紹了使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、強化學(xué)習(xí)的主要構(gòu)成

二、基于python的強化學(xué)習(xí)框架

三、gym

四、DQN算法

1.DQN算法兩個特點

(1)經(jīng)驗回放

(2)目標(biāo)網(wǎng)絡(luò)

2.DQN算法的流程

五、使用pytorch實現(xiàn)DQN算法

1.replay memory

2.神經(jīng)網(wǎng)絡(luò)部分

3.Agent

4.模型訓(xùn)練函數(shù)

5.訓(xùn)練模型

6.實驗結(jié)果

六、補充說明


一、強化學(xué)習(xí)的主要構(gòu)成

使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法

強化學(xué)習(xí)主要由兩部分組成:智能體(agent)和環(huán)境(env)。在強化學(xué)習(xí)過程中,智能體與環(huán)境一直在交互。智能體在環(huán)境里面獲取某個狀態(tài)后,它會利用該狀態(tài)輸出一個動作(action)。然后這個動作會在環(huán)境之中被執(zhí)行,環(huán)境會根據(jù)智能體采取的動作,輸出下一個狀態(tài)使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法以及當(dāng)前這個動作帶來的獎勵。智能體的目的就是盡可能多地從環(huán)境中獲取獎勵。

二、基于python的強化學(xué)習(xí)框架

本次我使用到的框架是pytorch,因為DQN算法的實現(xiàn)包含了部分的神經(jīng)網(wǎng)絡(luò),這部分對我來說使用pytorch會更順手,所以就選擇了這個。

三、gym

gym?定義了一套接口,用于描述強化學(xué)習(xí)中的環(huán)境這一概念,同時在其官方庫中,包含了一些已實現(xiàn)的環(huán)境。

四、DQN算法

使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法

傳統(tǒng)的強化學(xué)習(xí)算法使用的是Q表格存儲狀態(tài)價值函數(shù)或者動作價值函數(shù),但是實際應(yīng)用時,問題在的環(huán)境可能有很多種狀態(tài),甚至數(shù)不清,所以這種情況下使用離散的Q表格存儲價值函數(shù)會非常不合理,所以DQN(Deep Q-learning)算法,使用神經(jīng)網(wǎng)絡(luò)擬合動作價值函數(shù)。

通常DQN算法只能處理動作離散,狀態(tài)連續(xù)的情況,使用神經(jīng)網(wǎng)絡(luò)擬合出動作價值函數(shù), 然后針對動作價值函數(shù),選擇出當(dāng)狀態(tài)state固定的Q值最大的動作a。

使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法

1.DQN算法兩個特點

(1)經(jīng)驗回放

每一次的樣本都放到樣本池中,所以可以多次反復(fù)的使用一個樣本,重復(fù)利用。訓(xùn)練時一次隨機抽取多個數(shù)據(jù)樣本來進行訓(xùn)練。

(2)目標(biāo)網(wǎng)絡(luò)

DQN算法的更新目標(biāo)時讓逼近使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法, 但是如果兩個Q使用一個網(wǎng)絡(luò)計算,那么Q的目標(biāo)值也在不斷改變, 容易造成神經(jīng)網(wǎng)絡(luò)訓(xùn)練的不穩(wěn)定。DQN使用目標(biāo)網(wǎng)絡(luò),訓(xùn)練時目標(biāo)值Q使用目標(biāo)網(wǎng)絡(luò)來計算,目標(biāo)網(wǎng)絡(luò)的參數(shù)定時和訓(xùn)練網(wǎng)絡(luò)的參數(shù)同步。

2.DQN算法的流程

使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法

五、使用pytorch實現(xiàn)DQN算法

import time
import random
import torch
from torch import nn
from torch import optim
import gym
import numpy as np
import matplotlib.pyplot as plt
from collections import deque, namedtuple       # 隊列類型
from tqdm import tqdm                           # 繪制進度條用

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
Transition = namedtuple('Transition', ('state', 'action', 'reward', 'next_state', 'done'))

1.replay memory

class ReplayMemory(object):

    def __init__(self, memory_size):
        self.memory = deque([], maxlen=memory_size)

    def sample(self, batch_size):
        batch_data = random.sample(self.memory, batch_size)
        state, action, reward, next_state, done = zip(*batch_data)
        return state, action, reward, next_state, done

    def push(self, *args):
        # *args: 把傳進來的所有參數(shù)都打包起來生成元組形式
        # self.push(1, 2, 3, 4, 5)
        # args = (1, 2, 3, 4, 5)
        self.memory.append(Transition(*args))

    def __len__(self):
        return len(self.memory)

2.神經(jīng)網(wǎng)絡(luò)部分

class Qnet(nn.Module):

    def __init__(self, n_observations, n_actions):
        super(Qnet, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(n_observations, 128),
            nn.ReLU(),
            nn.Linear(128, n_actions)
        )

    def forward(self, state):
        return self.model(state)

3.Agent

class Agent(object):

    def __init__(self, observation_dim, action_dim, gamma, lr, epsilon, target_update):
        self.action_dim = action_dim
        self.q_net = Qnet(observation_dim, action_dim).to(device)
        self.target_q_net = Qnet(observation_dim, action_dim).to(device)
        self.gamma = gamma
        self.lr = lr
        self.epsilon = epsilon
        self.target_update = target_update
        self.count = 0

        self.optimizer = optim.Adam(params=self.q_net.parameters(), lr=lr)
        self.loss = nn.MSELoss()
       

    def take_action(self, state):
        if np.random.uniform(0, 1) < 1 - self.epsilon:
            state = torch.tensor(state, dtype=torch.float).to(device)
            action = torch.argmax(self.q_net(state)).item()
        else:
            action = np.random.choice(self.action_dim)
        return action

    def update(self, transition_dict):

        states = transition_dict.state
        actions = np.expand_dims(transition_dict.action, axis=-1) # 擴充維度
        rewards = np.expand_dims(transition_dict.reward, axis=-1) # 擴充維度
        next_states = transition_dict.next_state
        dones = np.expand_dims(transition_dict.done, axis=-1) # 擴充維度

        states = torch.tensor(states, dtype=torch.float).to(device)
        actions = torch.tensor(actions, dtype=torch.int64).to(device)
        rewards = torch.tensor(rewards, dtype=torch.float).to(device)
        next_states = torch.tensor(next_states, dtype=torch.float).to(device)
        dones = torch.tensor(dones, dtype=torch.float).to(device)

        # update q_values
        # gather(1, acitons)意思是dim=1按行號索引, index=actions
        # actions=[[1, 2], [0, 1]] 意思是索引出[[第一行第2個元素, 第1行第3個元素],[第2行第1個元素, 第2行第2個元素]]
        # 相反,如果是這樣
        # gather(0, acitons)意思是dim=0按列號索引, index=actions
        # actions=[[1, 2], [0, 1]] 意思是索引出[[第一列第2個元素, 第2列第3個元素],[第1列第1個元素, 第2列第2個元素]]
        # states.shape(64, 4) actions.shape(64, 1), 每一行是一個樣本,所以這里用dim=1很合適
        predict_q_values = self.q_net(states).gather(1, actions)
        with torch.no_grad():
            # max(1) 即 max(dim=1)在行向找最大值,這樣的話shape(64, ), 所以再加一個view(-1, 1)擴增至(64, 1)
            max_next_q_values = self.target_q_net(next_states).max(1)[0].view(-1, 1)
            q_targets = rewards + self.gamma * max_next_q_values * (1 - dones)
        l = self.loss(predict_q_values, q_targets)

        self.optimizer.zero_grad()
        l.backward()
        self.optimizer.step()

        if self.count % self.target_update == 0:
            # copy model parameters
            self.target_q_net.load_state_dict(self.q_net.state_dict())

        self.count += 1

4.模型訓(xùn)練函數(shù)

def run_episode(env, agent, repalymemory, batch_size):
    state = env.reset()
    reward_total = 0
    while True:
        action = agent.take_action(state)
        next_state, reward, done, _ = env.step(action)
        # print(reward)
        repalymemory.push(state, action, reward, next_state, done)
        reward_total += reward
        if len(repalymemory) > batch_size:
            state_batch, action_batch, reward_batch, next_state_batch, done_batch = repalymemory.sample(batch_size)
            T_data = Transition(state_batch, action_batch, reward_batch, next_state_batch, done_batch)
            # print(T_data)
            agent.update(T_data)
        state = next_state
        if done:
            break
    return reward_total


def episode_evaluate(env, agent, render):
    reward_list = []
    for i in range(5):
        state = env.reset()
        reward_episode = 0
        while True:
            action = agent.take_action(state)
            next_state, reward, done, _ = env.step(action)
            reward_episode += reward
            state = next_state
            if done:
                break
            if render:
                env.render()
        reward_list.append(reward_episode)
    return np.mean(reward_list).item()

def test(env, agent, delay_time):  
    state = env.reset()
    reward_episode = 0
    while True:
        action = agent.take_action(state)
        next_state, reward, done, _ = env.step(action)
        reward_episode += reward
        state = next_state
        if done:
            break
        env.render()
        time.sleep(delay_time)

5.訓(xùn)練CartPole-v0環(huán)境模型

模型訓(xùn)練使用到的環(huán)境時gym提供的CartPole游戲(Cart Pole - Gymnasium Documentation (farama.org)),這個環(huán)境比較經(jīng)典,小車運行結(jié)束的要求有三個:

(1)桿子的角度超過度

(2)小車位置大于(小車中心到達顯示屏邊緣)

(3)小車移動步數(shù)超過200(v1是500)

小車每走一步獎勵就會+1,所以在v0版本環(huán)境中,小車一次episode的最大獎勵為200。

使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法

if __name__ == "__main__":

    # print("prepare for RL")
    env = gym.make("CartPole-v0")
    env_name = "CartPole-v0"
    observation_n, action_n = env.observation_space.shape[0], env.action_space.n
    # print(observation_n, action_n)
    agent = Agent(observation_n, action_n, gamma=0.98, lr=2e-3, epsilon=0.01, target_update=10)

    replaymemory = ReplayMemory(memory_size=10000)
    batch_size = 64

    num_episodes = 200
    reward_list = []
    # print("start to train model")
    # 顯示10個進度條 
    for i in range(10):
        with tqdm(total=int(num_episodes/10), desc="Iteration %d" % i) as pbar:
            for episode in range(int(num_episodes / 10)):

                reward_episode = run_episode(env, agent, replaymemory, batch_size)
                reward_list.append(reward_episode)

                if (episode+1) % 10 == 0:

                    test_reward = episode_evaluate(env, agent, False)
                    # print("Episode %d, total reward: %.3f" % (episode, test_reward))
                    pbar.set_postfix({
                        'episode': '%d' % (num_episodes / 10 * i + episode + 1),
                        'return' : '%.3f' % (test_reward)
                    })
                pbar.update(1) # 更新進度條

    test(env, agent, 0.5)     # 最后用動畫觀看一下效果
    episodes_list = list(range(len(reward_list)))
    plt.plot(episodes_list, reward_list)
    plt.xlabel('Episodes')
    plt.ylabel('Returns')
    plt.title('Double DQN on {}'.format(env_name))
    plt.show()

6.實驗結(jié)果

使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法

使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法

六、補充說明

想要開啟動畫的話,這句代碼里面的False更改為True。

test_reward = episode_evaluate(env, agent, False)

參考資料:

蘑菇書EasyRL (datawhalechina.github.io)

DQN 算法 (boyuai.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-419260.html

到了這里,關(guān)于使用Pytorch實現(xiàn)強化學(xué)習(xí)——DQN算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 基于深度強化學(xué)習(xí)(DQN)的迷宮尋路算法

    基于深度強化學(xué)習(xí)(DQN)的迷宮尋路算法

    QLearning方法有著明顯的局限性,當(dāng)狀態(tài)和動作空間是離散的且維數(shù)不高時可使用Q-Table存儲每個狀態(tài)動作的Q值,而當(dāng)狀態(tài)和動作時高維連續(xù)時,該方法便不太適用??梢詫-Table的更新問題變成一個函數(shù)擬合問題,通過更新參數(shù)θ使得Q函數(shù)逼近最優(yōu)Q值。DL是解決參數(shù)學(xué)習(xí)的有效

    2023年04月22日
    瀏覽(80)
  • DQN,DDPG,PPO 等強化學(xué)習(xí)算法在人工智能中的未來發(fā)展方向:從大規(guī)模到小規(guī)模部署

    作者:禪與計算機程序設(shè)計藝術(shù) 隨著近年來人工智能領(lǐng)域的蓬勃發(fā)展,強化學(xué)習(xí)(Reinforcement Learning, RL)被越來越多的人認可并應(yīng)用于人工智能領(lǐng)域。如今,RL已經(jīng)可以處理許多復(fù)雜的問題,如自動駕駛、機器人控制等。在過去的一段時間里,我一直想和各位分享一下RL在人工

    2024年02月09日
    瀏覽(28)
  • 強化學(xué)習(xí)-DQN改進及一些強化學(xué)習(xí)路由優(yōu)化論文筆記

    強化學(xué)習(xí)-DQN改進及一些強化學(xué)習(xí)路由優(yōu)化論文筆記

    通用超參數(shù) Duel Structure VS→該state在當(dāng)前policy下的value QSA→該state進行這個action在當(dāng)前policy下的value advantage = VS - QSA 裁剪區(qū)域的確定? 34 194按行輸出min,33 193min為90*90 background knowledge [bisect Module] python自帶的二分查找的包 基本使用 bisect with list 在一個increasing array插入一個元素

    2024年04月13日
    瀏覽(32)
  • 【強化學(xué)習(xí)】——Q-learning算法為例入門Pytorch強化學(xué)習(xí)

    【強化學(xué)習(xí)】——Q-learning算法為例入門Pytorch強化學(xué)習(xí)

    ???♂? 個人主頁:@Lingxw_w的個人主頁 ???作者簡介:計算機研究生在讀,研究方向復(fù)雜網(wǎng)絡(luò)和數(shù)據(jù)挖掘,阿里云專家博主,華為云云享專家,CSDN專家博主、人工智能領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,安徽省優(yōu)秀畢業(yè)生 ?? 希望大家多多支持,我們一起進步!?? 如果文章對你有幫助的話

    2024年02月10日
    瀏覽(16)
  • DQN算法概述及基于Pytorch的DQN迷宮實戰(zhàn)代碼

    DQN算法概述及基于Pytorch的DQN迷宮實戰(zhàn)代碼

    Q-Learing 是在一個表格中存儲動作對應(yīng)的獎勵值,即狀態(tài)-價值函數(shù) Q(s,a) ,這種算法存在很大的局限性。在現(xiàn)實中很多情況下,強化學(xué)習(xí)任務(wù)所面臨的狀態(tài)空間是連續(xù)的,存在無窮多個狀態(tài),這種情況就不能再使用表格的方式存儲價值函數(shù)。 于是,誕生了 DQN 算法,即深度 Q

    2024年02月09日
    瀏覽(19)
  • 【機器學(xué)習(xí)】強化學(xué)習(xí)(六)-DQN(Deep Q-Learning)訓(xùn)練月球著陸器示例

    【機器學(xué)習(xí)】強化學(xué)習(xí)(六)-DQN(Deep Q-Learning)訓(xùn)練月球著陸器示例

    概述 Deep Q-Learning(深度 Q 學(xué)習(xí))是一種強化學(xué)習(xí)算法,用于解決決策問題,其中代理(agent)通過學(xué)習(xí)在不同環(huán)境中采取行動來最大化累積獎勵。Lunar Lander 是一個經(jīng)典的強化學(xué)習(xí)問題,其中代理的任務(wù)是控制一個著陸艙在月球表面著陸,最小化著陸過程中的燃料消耗。 以下

    2024年01月25日
    瀏覽(25)
  • DQN基本概念和算法流程(附Pytorch代碼)

    DQN基本概念和算法流程(附Pytorch代碼)

    DQN,Deep Q Network本質(zhì)上還是Q learning算法,它的算法精髓還是讓 Q 估計 Q_{估計} Q 估計 ? 盡可能接近 Q 現(xiàn)實 Q_{現(xiàn)實} Q 現(xiàn)實 ? ,或者說是讓當(dāng)前狀態(tài)下預(yù)測的Q值跟基于過去經(jīng)驗的Q值盡可能接近。在后面的介紹中 Q 現(xiàn)實 Q_{現(xiàn)實} Q 現(xiàn)實 ? 也被稱為TD Target 再來回顧下DQN算法和核

    2024年02月15日
    瀏覽(45)
  • Pytorch深度強化學(xué)習(xí)(3):詳解K搖臂賭博機模型和?-貪心算法

    本專欄重點介紹強化學(xué)習(xí)技術(shù)的數(shù)學(xué)原理,并且 采用Pytorch框架對常見的強化學(xué)習(xí)算法、案例進行實現(xiàn) ,幫助讀者理解并快速上手開發(fā)。同時,輔以各種機器學(xué)習(xí)、數(shù)據(jù)處理技術(shù),擴充人工智能的底層知識。 ??詳情:

    2024年02月11日
    瀏覽(16)
  • Pytorch深度強化學(xué)習(xí)1-2:詳解K搖臂賭博機模型和?-貪心算法

    本專欄重點介紹強化學(xué)習(xí)技術(shù)的數(shù)學(xué)原理,并且 采用Pytorch框架對常見的強化學(xué)習(xí)算法、案例進行實現(xiàn) ,幫助讀者理解并快速上手開發(fā)。同時,輔以各種機器學(xué)習(xí)、數(shù)據(jù)處理技術(shù),擴充人工智能的底層知識。 ??詳情:

    2024年02月11日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包