日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【深度强化学习】DQN训练超级玛丽闯关

發布時間:2025/3/8 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度强化学习】DQN训练超级玛丽闯关 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一期 MyEncyclopedia公眾號文章 通過代碼學Sutton強化學習:從Q-Learning 演化到 DQN,我們從原理上講解了DQN算法,這一期,讓我們通過代碼來實現DQN 在任天堂經典的超級瑪麗游戲中的自動通關吧。本系列將延續通過代碼學Sutton 強化學習系列,逐步通過代碼實現經典深度強化學習應用在各種游戲環境中。本文所有代碼在?

https://github.com/MyEncyclopedia/reinforcement-learning-2nd/tree/master/super_mario

最終訓練第一關結果動畫

DQN 算法回顧

上期詳細講解了DQN中的兩個重要的技術:Target Network 和 Experience Replay,正是有了它們才使得 Deep Q Network在實戰中容易收斂,以下是Deepmind 發表在Nature 的 Human-level control through deep reinforcement learning 的完整算法流程。

?

超級瑪麗 NES OpenAI 環境

安裝基于OpenAI gym的超級瑪麗環境執行下面的 pip 命令即可。

pip?install?gym-super-mario-bros

我們先來看一下游戲環境的輸入和輸出。下面代碼采用隨機的action來和游戲交互。有了 組合游戲系列3: 井字棋、五子棋的OpenAI Gym GUI環境?關于OpenAI Gym 的介紹,現在對于其基本的交互步驟已經不陌生了。

import?gym_super_mario_bros from?random?import?random,?randrange from?gym_super_mario_bros.actions?import?RIGHT_ONLY from?nes_py.wrappers?import?JoypadSpace from?gym?import?wrappersenv?=?gym_super_mario_bros.make('SuperMarioBros-v0') env?=?JoypadSpace(env,?RIGHT_ONLY)#?Play?randomly done?=?False env.reset()step?=?0 while?not?done:action?=?randrange(len(RIGHT_ONLY))state,?reward,?done,?info?=?env.step(action)print(done,?step,?info)env.render()step?+=?1env.close()

隨機策略的效果如下

注意我們在游戲環境初始化的時候用了參數 RIGHT_ONLY,它定義成五種動作的list,表示僅使用右鍵的一些組合,適用于快速訓練來完成Mario第一關。

RIGHT_ONLY?=?[['NOOP'],['right'],['right',?'A'],['right',?'B'],['right',?'A',?'B'], ]

觀察一些 info 輸出內容,coins表示金幣獲得數量,flag_get 表示是否取得最后的旗子,time 剩余時間,以及 Mario 大小狀態和所在的 x,y位置。

{"coins":0,"flag_get":False,"life":2,"score":0,"stage":1,"status":"small","time":381,"world":1,"x_pos":594,"y_pos":89 }

游戲圖像處理

Deep Reinforcement Learning 一般是 end-to-end learning,意味著將游戲的 screen image,即 observed state 直接視為真實狀態 state,喂給神經網絡去訓練。于此相反的另一種做法是,通過游戲環境拿到內部狀態,例如所有相關物品的位置和屬性作為模型輸入。這兩種方式的區別在我看來有兩點。第一點,用觀察到的屏幕像素代替真正的狀態 state,在partially observable 的環境時可能因為 non-stationarity 導致無法很好的工作,而拿內部狀態利用了額外的作弊信息,在partially observable環境中也可以工作。第二點,第一種方式屏幕像素維度比較高,輸入數據量大,需要神經網絡的大量訓練擬合,第二種方式,內部真實狀態往往維度低得多,訓練起來很快,但缺點是因為除了內部狀態往往還需要游戲相關規則作為輸入,因此generalization能力不如前者強。

?

這里,我們當然采樣屏幕像素的 end-to-end 方式了,自然首要任務是將游戲幀圖像有效處理。超級瑪麗游戲環境的屏幕輸出是 (240, 256, 3) shape的 numpy array,通過下面一系列的轉換,盡可能的在不影響訓練效果的情況下減小采樣到的數據量。

  • MaxAndSkipFrameWrapper:每4個frame連在一起,采取同樣的動作,降低frame數量

  • FrameDownsampleWrapper:將原始的 (240, 256, 3) down sample 到 (84, 84, 1)

  • ImageToPyTorchWrapper:轉換成適合 pytorch 的 shape (1, 84, 84)?

  • FrameBufferWrapper:保存最后4次屏幕采樣

  • NormalizeFloats:Normalize 成 [0., 1.0] 的浮點值

  • def?wrap_environment(env_name:?str,?action_space:?list)?->?Wrapper:env?=?make(env_name)env?=?JoypadSpace(env,?action_space)env?=?MaxAndSkipFrameWrapper(env)env?=?FrameDownsampleWrapper(env)env?=?ImageToPyTorchWrapper(env)env?=?FrameBufferWrapper(env,?4)env?=?NormalizeFloats(env)return?env

    CNN 模型

    模型比較簡單,三個卷積層后做 softmax輸出,輸出維度數為離散動作數。act() 采用了epsilon-greedy 模式,即在epsilon小概率時采取隨機動作來 explore,大于epsilon時采取估計的最可能動作來 exploit。

    class?DQNModel(nn.Module):def?__init__(self,?input_shape,?num_actions):super(DQNModel,?self).__init__()self._input_shape?=?input_shapeself._num_actions?=?num_actionsself.features?=?nn.Sequential(nn.Conv2d(input_shape[0],?32,?kernel_size=8,?stride=4),nn.ReLU(),nn.Conv2d(32,?64,?kernel_size=4,?stride=2),nn.ReLU(),nn.Conv2d(64,?64,?kernel_size=3,?stride=1),nn.ReLU())self.fc?=?nn.Sequential(nn.Linear(self.feature_size,?512),nn.ReLU(),nn.Linear(512,?num_actions))def?forward(self,?x):x?=?self.features(x).view(x.size()[0],?-1)return?self.fc(x)def?act(self,?state,?epsilon,?device):if?random()?>?epsilon:state?=?torch.FloatTensor(np.float32(state)).unsqueeze(0).to(device)q_value?=?self.forward(state)action?=?q_value.max(1)[1].item()else:action?=?randrange(self._num_actions)return?action

    Experience Replay 緩存

    實現采用了 Pytorch CartPole DQN 的官方代碼,本質是一個最大為 capacity 的 list 保存了采樣到的 (s, a, r, s', is_done) ?五元組。

    Transition?=?namedtuple('Transition',?('state',?'action',?'reward',?'next_state',?'done'))class?ReplayMemory:def?__init__(self,?capacity):self.capacity?=?capacityself.memory?=?[]self.position?=?0def?push(self,?*args):if?len(self.memory)?<?self.capacity:self.memory.append(None)self.memory[self.position]?=?Transition(*args)self.position?=?(self.position?+?1)?%?self.capacitydef?sample(self,?batch_size):return?random.sample(self.memory,?batch_size)def?__len__(self):return?len(self.memory)

    DQNAgent

    我們將 DQN 的邏輯封裝在 DQNAgent 類中。DQNAgent 成員變量包括兩個 DQNModel,一個ReplayMemory。

    train() 方法中會每隔一定時間將 Target Network 的參數同步成現行Network的參數。在td_loss_backprop()方法中采樣 ReplayMemory 中的五元組,通過minimize TD error方式來改進現行 Network 參數 。Loss函數為:

    class?DQNAgent():def?act(self,?state,?episode_idx):self.update_epsilon(episode_idx)action?=?self.model.act(state,?self.epsilon,?self.device)return?actiondef?process(self,?episode_idx,?state,?action,?reward,?next_state,?done):self.replay_mem.push(state,?action,?reward,?next_state,?done)self.train(episode_idx)def?train(self,?episode_idx):if?len(self.replay_mem)?>?self.initial_learning:if?episode_idx?%?self.target_update_frequency?==?0:self.target_model.load_state_dict(self.model.state_dict())self.optimizer.zero_grad()self.td_loss_backprop()self.optimizer.step()def?td_loss_backprop(self):transitions?=?self.replay_mem.sample(self.batch_size)batch?=?Transition(*zip(*transitions))state?=?Variable(FloatTensor(np.float32(batch.state))).to(self.device)action?=?Variable(LongTensor(batch.action)).to(self.device)reward?=?Variable(FloatTensor(batch.reward)).to(self.device)next_state?=?Variable(FloatTensor(np.float32(batch.next_state))).to(self.device)done?=?Variable(FloatTensor(batch.done)).to(self.device)q_values?=?self.model(state)next_q_values?=?self.target_net(next_state)q_value?=?q_values.gather(1,?action.unsqueeze(-1)).squeeze(-1)next_q_value?=?next_q_values.max(1)[0]expected_q_value?=?reward?+?self.gamma?*?next_q_value?*?(1?-?done)loss?=?(q_value?-?expected_q_value.detach()).pow(2)loss?=?loss.mean()loss.backward()

    外層控制代碼

    最后是外層調用代碼,基本和以前文章一樣。

    def?train(env,?args,?agent):for?episode_idx?in?range(args.num_episodes):episode_reward?=?0.0state?=?env.reset()while?True:action?=?agent.act(state,?episode_idx)if?args.render:env.render()next_state,?reward,?done,?stats?=?env.step(action)agent.process(episode_idx,?state,?action,?reward,?next_state,?done)state?=?next_stateepisode_reward?+=?rewardif?done:print(f'{episode_idx}:?{episode_reward}')break

    著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

    往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 獲取本站知識星球優惠券,復制鏈接直接打開: https://t.zsxq.com/qFiUFMV 本站qq群704220115。加入微信群請掃碼:

    總結

    以上是生活随笔為你收集整理的【深度强化学习】DQN训练超级玛丽闯关的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 18久久| 国产一区二区毛片 | 少妇性色av| 欧美性xxxx | 久操香蕉 | www.jizzcom| 最新中文字幕免费 | 日本a级免费 | 伊人福利视频 | 久久国产精品二区 | 日本一区二区高清视频 | 精品国内自产拍在线观看视频 | 国产日产精品一区二区三区四区 | 香蕉综合网 | 国产精选一区二区三区 | 99久久婷婷国产综合精品青牛牛 | 久久久av电影 | 777精品视频 | 成人免费视频观看 | 人操人视频 | 亚洲中文字幕无码一区 | 88av.com| 久久久久久久久国产精品 | jzzijzzij亚洲成熟少妇18 欧美www在线观看 | 黄色午夜影院 | 亚洲一区不卡在线 | 久久久久久久久网站 | 亚洲天堂网站在线 | 久久亚洲国产成人精品性色 | 欧美在线观看视频一区二区 | 干老太太视频 | 韩国毛片一区二区 | 午夜67194 | 黑人干亚洲女人 | 一二三不卡视频 | 另类ts人妖一区二区三区 | 亚洲视频天天射 | 91国产免费看 | 黄色中文字幕在线观看 | 天天射天天舔 | 在线免费观看黄色小视频 | 日本在线视频www色 国产在线视频网址 | 欧美日韩一本 | 日本啪啪网 | 99久久国产视频 | 亚洲无吗一区二区三区 | 日韩精品2区 | 亚洲第一成年网 | 黄色一级片在线免费观看 | 日本人妻换人妻毛片 | 天堂а√在线中文在线 | 免费在线观看黄视频 | 国产二页 | 五月婷婷丁香网 | 久久久久无码国产精品一区李宗瑞 | 午夜高清 | 亚洲国产婷婷香蕉久久久久久99 | 成人在线视频播放 | 成人动漫一区二区 | 久久久久久欧美精品se一二三四 | 日韩欧美精品在线视频 | 你懂的亚洲 | 在线天堂网 | 成人免费av网站 | 日本xxxx18| 一区二区三区国产 | 寡妇av| 97色吧| 人人插人人澡 | 色呦呦网站 | 免费看黄色三级三级 | 日韩av不卡在线 | 日韩av中文字幕在线播放 | 日本老年老熟无码 | 邻居少妇张开腿让我爽了在线观看 | 空姐吹箫视频大全 | 国产欧美色图 | 超碰毛片 | 可以免费观看的毛片 | 丁香激情六月 | 欧美熟妇精品一区二区蜜桃视频 | 天天色小说 | 美女看片 | 超碰天堂| 老熟妇午夜毛片一区二区三区 | 亚洲女人毛茸茸 | 三级无遮挡 | 在线观看国产欧美 | 天堂网av中文字幕 | 日本免费在线观看视频 | 制服一区二区 | 小毛片在线观看 | 亚洲免费在线观看av | 97色伦图片 | 日本黄色片| 国产欧美精品国产国产专区 | 色综合99久久久无码国产精品 | 97超碰超碰 | 秋霞精品|