欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用actor-critic方法來控制CartPole-V0 游戲詳解

 更新時(shí)間:2023年04月12日 11:25:08   作者:我是王大你是誰  
這篇文章主要為大家介紹了使用actor-critic方法來控制CartPole-V0 游戲詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

CartPole 介紹

在一個(gè)光滑的軌道上有個(gè)推車,桿子垂直微置在推車上,隨時(shí)有倒的風(fēng)險(xiǎn)。系統(tǒng)每次對(duì)推車施加向左或者向右的力,但我們的目標(biāo)是讓桿子保持直立。桿子保持直立的每個(gè)時(shí)間單位都會(huì)獲得 +1 的獎(jiǎng)勵(lì)。但是當(dāng)桿子與垂直方向成 15 度以上的位置,或者推車偏離中心點(diǎn)超過 2.4 個(gè)單位后,這一輪局游戲結(jié)束。因此我們可以獲得的最高回報(bào)等于 200 。我們這里就是要通過使用 PPO 算法來訓(xùn)練一個(gè)強(qiáng)化學(xué)習(xí)模型 actor-critic ,通過對(duì)比模型訓(xùn)練前后的游戲運(yùn)行 gif 圖,可以看出來我們訓(xùn)練好的模型能長(zhǎng)時(shí)間保持桿子處于垂直狀態(tài)。

Actor Critic 介紹

當(dāng) agent 采取行動(dòng)并在環(huán)境中移動(dòng)時(shí),它在觀察到的環(huán)境狀態(tài)的情況下,學(xué)習(xí)兩個(gè)可能的輸出:

  • 接下來最合適的一個(gè)操作,actor 負(fù)責(zé)此部分輸出。
  • 未來可能獲得的獎(jiǎng)勵(lì)總和,critic 負(fù)責(zé)此部分的輸出。

actor 和 critic 通過不斷地學(xué)習(xí),以便使得 agent 在游戲中最終獲得的獎(jiǎng)勵(lì)最大,這里的 agent 就是那個(gè)小車。

庫(kù)準(zhǔn)備

tensorflow-gpu==2.10.0
imageio==2.26.1
keras==2.10,0
gym==0.20.0
pyglet==1.5.20
scipy==1.10.1

設(shè)置超參數(shù)

這部分代碼主要有:

(1)導(dǎo)入所需的Python庫(kù):gym、numpy、tensorflow 和 keras。

(2)設(shè)置整個(gè)環(huán)境的超參數(shù):種子、折扣因子和每個(gè)回合的最大步數(shù)。

(3)創(chuàng)建 CartPole-v0 環(huán)境,并設(shè)置種子。

(4)定義一個(gè)非常小的值 eps ,表示的機(jī)器兩個(gè)不同的數(shù)字之間的最小差值,用于檢驗(yàn)數(shù)值穩(wěn)定性。

import gym # 導(dǎo)入Gym庫(kù),用于開發(fā)和比較強(qiáng)化學(xué)習(xí)算法
import numpy as np # 導(dǎo)入NumPy庫(kù),用于進(jìn)行科學(xué)計(jì)算
import tensorflow as tf # 導(dǎo)入TensorFlow庫(kù)
from tensorflow import keras # 導(dǎo)入keras模塊,這是一個(gè)高級(jí)神經(jīng)網(wǎng)絡(luò)API
from tensorflow.keras import layers # 導(dǎo)入keras中的layers模塊,用于創(chuàng)建神經(jīng)網(wǎng)絡(luò)層
seed = 42 # 設(shè)定隨機(jī)種子,用于復(fù)現(xiàn)實(shí)驗(yàn)結(jié)果
gamma = 0.99 # 定義折扣率,用于計(jì)算未來獎(jiǎng)勵(lì)的現(xiàn)值
max_steps_per_episode = 10000 # 設(shè)定每個(gè) episode 的最大步數(shù)
env = gym.make("CartPole-v0") # 創(chuàng)建 CartPole-v0 環(huán)境實(shí)例
env.seed(seed) # 設(shè)定環(huán)境的隨機(jī)種子
eps = np.finfo(np.float32).eps.item() # 獲取 float32 數(shù)據(jù)類型的誤差最小值 epsilon 

Actor Critic 結(jié)構(gòu)搭建

(1)Actor:將環(huán)境的狀態(tài)作為輸入,返回操作空間中每個(gè)操作及其概率值,其實(shí)總共只有兩個(gè)操作,往左和往右。

(2)Critic:將環(huán)境的狀態(tài)作為輸入,返回未來獎(jiǎng)勵(lì)綜合的估計(jì)。

(3)在這里網(wǎng)絡(luò)結(jié)構(gòu)中我們?cè)谝婚_始接收 inputs 之后,我們的 Actor 和 Critic 共用了中間的部分隱藏層 common 層,然后在一個(gè)輸出分支上連接了一個(gè)全連接進(jìn)行動(dòng)作分類作為 action ,另一個(gè)分支上連接了一個(gè)全連接層進(jìn)行未來獎(jiǎng)勵(lì)計(jì)算作為 critic 。

num_inputs = 4 # 狀態(tài)空間的維度,即輸入層的節(jié)點(diǎn)數(shù)
num_actions = 2 # 行為空間的維度,即輸出層的節(jié)點(diǎn)數(shù)
num_hidden = 128 # 隱藏層的節(jié)點(diǎn)數(shù)
inputs = layers.Input(shape=(num_inputs,)) # 創(chuàng)建輸入層,指定輸入的形狀
common = layers.Dense(num_hidden, activation="relu")(inputs) # 創(chuàng)建一個(gè)全連接層,包含num_hidden 個(gè)神經(jīng)元,使用 ReLU 作為激活函數(shù)
action = layers.Dense(num_actions, activation="softmax")(common) # 創(chuàng)建一個(gè)全連接層,包含 num_actions 個(gè)神經(jīng)元,使用 softmax 作為激活函數(shù)
critic = layers.Dense(1)(common) # 創(chuàng)建一個(gè)全連接層,包含1個(gè)神經(jīng)元
model = keras.Model(inputs=inputs, outputs=[action, critic]) # 創(chuàng)建一個(gè) Keras 模型,包含輸入層、共享的隱藏層和兩個(gè)輸出層

訓(xùn)練前的樣子

import imageio
start = env.reset() 
frames = []
for t in range(max_steps_per_episode):
    frames.append(env.render(mode='rgb_array'))
    start = start.reshape(1, -1)
    start, reward, done, _ = env.step(np.random.choice(num_actions, p=np.squeeze(action_probs)))
    if done:
        break
with imageio.get_writer('未訓(xùn)練前的樣子.gif', mode='I') as writer:
    for frame in frames:
        writer.append_data(frame)

模型訓(xùn)練

設(shè)置訓(xùn)練所需要的優(yōu)化器,以及各種參數(shù)來記錄每個(gè)時(shí)間步上的數(shù)據(jù)。

optimizer = keras.optimizers.Adam(learning_rate=0.01) # 創(chuàng)建 Adam 優(yōu)化器實(shí)例,設(shè)置學(xué)習(xí)率為 0.01
huber_loss = keras.losses.Huber() # 創(chuàng)建損失函數(shù)實(shí)例
action_probs_history = [] # 創(chuàng)建一個(gè)列表,用于保存 action 網(wǎng)絡(luò)在每個(gè)步驟中采取各個(gè)行動(dòng)的概率
critic_value_history = [] # 創(chuàng)建一個(gè)列表,用于保存 critic 網(wǎng)絡(luò)在每個(gè)步驟中對(duì)應(yīng)的值
rewards_history = [] # 創(chuàng)建一個(gè)列表,用于保存每個(gè)步驟的獎(jiǎng)勵(lì)值
running_reward = 0 # 初始化運(yùn)行過程中的每輪獎(jiǎng)勵(lì)
episode_count = 0 # 初始化 episode 計(jì)數(shù)器

一直訓(xùn)練下去,直到滿足獎(jiǎng)勵(lì)大于 195 才會(huì)停下訓(xùn)練過程。

while True:  
    state = env.reset()  # 新一輪游戲開始,重置環(huán)境
    episode_reward = 0  # 記錄本輪游戲的總獎(jiǎng)勵(lì)值
    with tf.GradientTape() as tape:  # 構(gòu)建 GradientTape 用于計(jì)算梯度
        for timestep in range(1, max_steps_per_episode): # 本輪游戲如果一切正常會(huì)進(jìn)行 max_steps_per_episode 步
            state = tf.convert_to_tensor(state)  # 將狀態(tài)轉(zhuǎn)換為張量
            state = tf.expand_dims(state, 0)  # 擴(kuò)展維度,以適應(yīng)模型的輸入形狀
            action_probs, critic_value = model(state)  # 前向傳播,得到 action 網(wǎng)絡(luò)輸出的動(dòng)作空間的概率分布,和 critic 網(wǎng)絡(luò)預(yù)測(cè)的獎(jiǎng)勵(lì)值
            critic_value_history.append(critic_value[0, 0])  # 將上面 critic 預(yù)測(cè)的獎(jiǎng)勵(lì)值記錄在 critic_value_history 列表中
            action = np.random.choice(num_actions, p=np.squeeze(action_probs))  # 依據(jù)概率分布抽樣某個(gè)動(dòng)作,當(dāng)然了某個(gè)動(dòng)作概率越大越容易被抽中,同時(shí)也保留了一定的隨機(jī)性
            action_probs_history.append(tf.math.log(action_probs[0, action]))  # 將使用該動(dòng)作的對(duì)數(shù)概率值記錄在 action_probs_history 列表中
            state, reward, done, _ = env.step(action)  # 游戲環(huán)境使用選中的動(dòng)作去執(zhí)行,得到下一個(gè)游戲狀態(tài)、獎(jiǎng)勵(lì)、是否終止和其他信息
            rewards_history.append(reward)  # 將該時(shí)刻的獎(jiǎng)勵(lì)記錄在 rewards_history 列表中
            episode_reward += reward  # 累加本輪游戲的總獎(jiǎng)勵(lì)值
            if done:  # 如果到達(dá)終止?fàn)顟B(tài),則結(jié)束循環(huán)
                break
        running_reward = 0.05 * episode_reward + (1 - 0.05) * running_reward  # 計(jì)算平均獎(jiǎng)勵(lì)
        returns = []  # 存儲(chǔ)折扣回報(bào)
        discounted_sum = 0
        for r in rewards_history[::-1]:  # 從后往前遍歷獎(jiǎng)勵(lì)的歷史值
            discounted_sum = r + gamma * discounted_sum  # 計(jì)算折扣回報(bào)
            returns.insert(0, discounted_sum)  # 將折扣回報(bào)插入列表的開頭,最后形成的還是從前往后的折扣獎(jiǎng)勵(lì)列表
        returns = np.array(returns)  # 將折扣回報(bào)轉(zhuǎn)換為數(shù)組
        returns = (returns - np.mean(returns)) / (np.std(returns) + eps)  # 歸一化折扣回報(bào)
        returns = returns.tolist()  # 將折扣回報(bào)轉(zhuǎn)換為列表形式
        history = zip(action_probs_history, critic_value_history, returns)  # 將三個(gè)列表進(jìn)行 zip 壓縮
        actor_losses = []  # 存儲(chǔ) action 網(wǎng)絡(luò)的損失
        critic_losses = []  # 存儲(chǔ) critic 網(wǎng)絡(luò)的損失
        for log_prob, value, ret in history:
            diff = ret - value
            actor_losses.append(-log_prob * diff)  # 計(jì)算 actor 的損失函數(shù)
            critic_losses.append(
                huber_loss(tf.expand_dims(value, 0), tf.expand_dims(ret, 0)) # 計(jì)算 critic 的損失函數(shù)
            )
        loss_value = sum(actor_losses) + sum(critic_losses) # 計(jì)算總損失函數(shù)
        grads = tape.gradient(loss_value, model.trainable_variables) # 計(jì)算梯度
        optimizer.apply_gradients(zip(grads, model.trainable_variables)) # 更新模型參數(shù)
        action_probs_history.clear() # 清空之前的歷史記錄
        critic_value_history.clear() # 清空之前的歷史記錄
        rewards_history.clear() # 清空之前的歷史記錄
    episode_count += 1 # 當(dāng)一輪游戲結(jié)束時(shí), episode 加一
    if episode_count % 10 == 0: # 每訓(xùn)練 10 個(gè) episode ,輸出當(dāng)前的平均獎(jiǎng)勵(lì)
        template = "在第 {} 輪游戲中獲得獎(jiǎng)勵(lì): {:.2f} 分"
        print(template.format(episode_count, running_reward))
    if running_reward > 195:  # 如果平均獎(jiǎng)勵(lì)超過195,視為任務(wù)已經(jīng)解決
        print("獎(jiǎng)勵(lì)超過 195 ,訓(xùn)練結(jié)束")
        break

打?。?/p>

在第 10 輪游戲中獲得獎(jiǎng)勵(lì): 11.17 分
在第 20 輪游戲中獲得獎(jiǎng)勵(lì): 17.12 分
...
在第 170 輪游戲中獲得獎(jiǎng)勵(lì): 155.02 分
在第 180 輪游戲中獲得獎(jiǎng)勵(lì): 171.67 分
...
在第 220 輪游戲中獲得獎(jiǎng)勵(lì): 193.74 分
獎(jiǎng)勵(lì)超過 195 ,訓(xùn)練結(jié)束

訓(xùn)練后的樣子

import imageio
start = env.reset() 
frames = []
for t in range(max_steps_per_episode):
    frames.append(env.render(mode='rgb_array'))
    start = start.reshape(1, -1)
    action_probs, _ = model(start)
    action = np.random.choice(num_actions, p=np.squeeze(action_probs))
    start, reward, done, _ = env.step(action)
    if done:
        break
with imageio.get_writer('訓(xùn)練后的樣子.gif', mode='I') as writer:
    for frame in frames:
        writer.append_data(frame)

以上就是使用actor-critic方法來控制CartPole-V0 游戲詳解的詳細(xì)內(nèi)容,更多關(guān)于 actor-critic控制CartPole-V0的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python實(shí)現(xiàn)GATK多線程加速示例

    python實(shí)現(xiàn)GATK多線程加速示例

    這篇文章主要為大家介紹了python實(shí)現(xiàn)GATK多線程加速示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • pytorch常用函數(shù)定義及resnet模型修改實(shí)例

    pytorch常用函數(shù)定義及resnet模型修改實(shí)例

    這篇文章主要為大家介紹了pytorch常用函數(shù)定義及resnet模型修改實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python 開發(fā)的三種運(yùn)行模式詳細(xì)介紹

    python 開發(fā)的三種運(yùn)行模式詳細(xì)介紹

    這篇文章主要介紹了python 開發(fā)的三種運(yùn)行模式詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • python 中字典嵌套列表的方法

    python 中字典嵌套列表的方法

    今天小編就為大家分享一篇python 中字典嵌套列表的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python實(shí)現(xiàn)網(wǎng)頁(yè)文件轉(zhuǎn)PDF文件和PNG圖片的示例代碼

    Python實(shí)現(xiàn)網(wǎng)頁(yè)文件轉(zhuǎn)PDF文件和PNG圖片的示例代碼

    這篇文章主要介紹了如何利用Python分別實(shí)現(xiàn)網(wǎng)頁(yè)文件轉(zhuǎn)為PDF文件和網(wǎng)頁(yè)文件轉(zhuǎn)PNG圖片的示例代碼,文中的代碼簡(jiǎn)潔易懂,感興趣的可以動(dòng)手試試
    2022-01-01
  • 對(duì)pyqt5多線程正確的開啟姿勢(shì)詳解

    對(duì)pyqt5多線程正確的開啟姿勢(shì)詳解

    今天小編就為大家分享一篇對(duì)pyqt5多線程正確的開啟姿勢(shì)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 使用Pycharm為項(xiàng)目創(chuàng)建一個(gè)虛擬環(huán)境完整圖文教程

    使用Pycharm為項(xiàng)目創(chuàng)建一個(gè)虛擬環(huán)境完整圖文教程

    這篇文章主要給大家介紹了關(guān)于使用Pycharm為項(xiàng)目創(chuàng)建一個(gè)虛擬環(huán)境的相關(guān)資料,我們?cè)谑褂胮ycharm做項(xiàng)目時(shí),最好給每一個(gè)工程都創(chuàng)建一個(gè)虛擬環(huán)境,將對(duì)應(yīng)的安裝包放在該虛擬環(huán)境中,避免項(xiàng)目與項(xiàng)目之間產(chǎn)生關(guān)系或沖突,便于管理,需要的朋友可以參考下
    2023-09-09
  • Django中使用AJAX的詳細(xì)過程

    Django中使用AJAX的詳細(xì)過程

    在項(xiàng)目中前后端數(shù)據(jù)相互是一種常態(tài),下面這篇文章主要給大家介紹了關(guān)于Django中使用AJAX的詳細(xì)過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • python批處理將圖片進(jìn)行放大實(shí)例代碼

    python批處理將圖片進(jìn)行放大實(shí)例代碼

    最近處理一些規(guī)格不一的照片,需要修改成指定尺寸便于打印,下面這篇文章主要給大家介紹了關(guān)于python批處理將圖片進(jìn)行放大的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • Python實(shí)現(xiàn)批量采集商品數(shù)據(jù)的示例詳解

    Python實(shí)現(xiàn)批量采集商品數(shù)據(jù)的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)批量采集商品的數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論