日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

TensorFlow 2.0深度强化学习指南

發布時間:2024/8/23 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TensorFlow 2.0深度强化学习指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在本教程中,我將通過實施Advantage Actor-Critic(演員-評論家,A2C)代理來解決經典的CartPole-v0環境,通過深度強化學習(DRL)展示即將推出的TensorFlow2.0特性。雖然我們的目標是展示TensorFlow2.0,但我將盡最大努力讓DRL的講解更加平易近人,包括對該領域的簡要概述。

事實上,由于2.0版本的焦點是讓開發人員的生活變得更輕松,所以我認為現在是使用TensorFlow進入DRL的好時機,本文用到的例子的源代碼不到150行!代碼可以在這里或者這里獲取。

建立

由于TensorFlow2.0仍處于試驗階段,我建議將其安裝在獨立的虛擬環境中。我個人比較喜歡Anaconda,所以我將用它來演示安裝過程:

<span style="color:#f8f8f2"><code class="language-python"><span style="color:#f8f8f2">></span> conda create <span style="color:#f8f8f2">-</span>n tf2 python<span style="color:#f8f8f2">=</span><span style="color:#ae81ff"><span style="color:#ae81ff">3.6</span></span> <span style="color:#f8f8f2">></span> source activate tf2 <span style="color:#f8f8f2">></span> pip install tf<span style="color:#f8f8f2">-</span>nightly<span style="color:#ae81ff"><span style="color:#ae81ff">-2.0</span></span><span style="color:#f8f8f2">-</span>preview <span style="color:slategray"><span style="color:#75715e"># tf-nightly-gpu-2.0-preview for GPU version</span></span></code></span>

讓我們快速驗證一切是否按能夠正常工作:

<span style="color:#f8f8f2"><code class="language-python"><span style="color:#f8f8f2"><span style="color:#75715e">>></span></span><span style="color:#f8f8f2"><span style="color:#75715e">></span></span> <span style="color:#66d9ef"><span style="color:#f92672">import</span></span> tensorflow <span style="color:#66d9ef"><span style="color:#f92672">as</span></span> tf <span style="color:#f8f8f2"><span style="color:#75715e">>></span></span><span style="color:#f8f8f2"><span style="color:#75715e">></span></span> <span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span>tf<span style="color:#f8f8f2">.</span>__version__<span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">1.13</span></span><span style="color:#f8f8f2"><span style="color:#ae81ff">.</span></span><span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span><span style="color:#f8f8f2">-</span>dev20190117 <span style="color:#f8f8f2"><span style="color:#75715e">>></span></span><span style="color:#f8f8f2"><span style="color:#75715e">></span></span> <span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span>tf<span style="color:#f8f8f2">.</span>executing_eagerly<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#f92672">True</span></span></code></span>

不要擔心1.13.x版本,這只是意味著它是早期預覽。這里要注意的是我們默認處于eager模式!

<span style="color:#f8f8f2"><code class="language-none">>>> print(tf.reduce_sum([1, 2, 3, 4, 5])) tf.Tensor(15, shape=(), dtype=int32)</code></span>

如果你還不熟悉eager模式,那么實質上意味著計算是在運行時被執行的,而不是通過預編譯的圖(曲線圖)來執行。你可以在TensorFlow文檔中找到一個很好的概述。

深度化學

一般而言,強化學習是解決連續決策問題的高級框架。RL通過基于某些agent進行導航觀察環境,并且獲得獎勵。大多數RL算法通過最大化代理在一輪游戲期間收集的獎勵總和來工作。

基于RL的算法的輸出通常是policy(策略)-將狀態映射到函數有效的策略中,有效的策略可以像硬編碼的無操作動作一樣簡單。在某些狀態下,隨機策略表示為行動的條件概率分布。

評論家方(Actor-Critic Methods)

RL算法通常基于它們優化的目標函數進行分組。Value-based諸如DQN之類的方法通過減少預期的狀態-動作值的誤差來工作。

策略梯度(Policy Gradients)方法通過調整其參數直接優化策略本身,通常通過梯度下降完成的。完全計算梯度通常是難以處理的,因此通常要通過蒙特卡羅方法估算它們。

最流行的方法是兩者的混合:actor-critic方法,其中代理策略通過策略梯度進行優化,而基于值的方法用作預期值估計的引導。

深度演-方法

雖然很多基礎的RL理論是在表格案例中開發的,但現代RL幾乎完全是用函數逼近器完成的,例如人工神經網絡。具體而言,如果策略和值函數用深度神經網絡近似,則RL算法被認為是“深度”。

異步優勢-評論家(actor-critical)

多年來,為了提高學習過程的樣本效率和穩定性,技術發明者已經進行了一些改進。

首先,梯度加權回報:折現的未來獎勵,這在一定程度上緩解了信用分配問題,并以無限的時間步長解決了理論問題。

其次,使用優勢函數代替原始回報。優勢在收益與某些基線之間的差異之間形成,并且可以被視為衡量給定值與某些平均值相比有多好的指標。

第三,在目標函數中使用額外的熵最大化項以確保代理充分探索各種策略。本質上,熵以均勻分布最大化來測量概率分布的隨機性。

最后,并行使用多個工人加速樣品采集,同時在訓練期間幫助它們去相關。

將所有這些變化與深度神經網絡相結合,我們得出了兩種最流行的現代算法:異步優勢演員評論家(actor-critical)算法,簡稱A3C或者A2C。兩者之間的區別在于技術性而非理論性:顧名思義,它歸結為并行工人如何估計其梯度并將其傳播到模型中。

有了這個,我將結束我們的DRL方法之旅,因為博客文章的重點更多是關于TensorFlow2.0的功能。如果你仍然不了解該主題,請不要擔心,代碼示例應該更清楚。如果你想了解更多,那么一個好的資源就可以開始Deep RL中進行Spinning Up

使用TensorFlow 2.0優勢-評論

讓我們看看實現現代DRL算法的基礎是什么:演員評論家代理(actor-critic agent。如前一節所述,為簡單起見,我們不會實現并行工作程序,盡管大多數代碼都會支持它,感興趣的讀者可以將其用作鍛煉機會。

作為測試平臺,我們將使用CartPole-v0環境。雖然它有點簡單,但它仍然是一個很好的選擇開始。在實現RL算法時,我總是依賴它作為一種健全性檢查。

Keras Model API實現的策略和價值

首先,讓我們在單個模型類下創建策略和價值估計NN:

<span style="color:#f8f8f2"><code class="language-python"><span style="color:#66d9ef"><span style="color:#f92672">import</span></span> numpy <span style="color:#66d9ef"><span style="color:#f92672">as</span></span> np <span style="color:#66d9ef"><span style="color:#f92672">import</span></span> tensorflow <span style="color:#66d9ef"><span style="color:#f92672">as</span></span> tf <span style="color:#66d9ef"><span style="color:#f92672">import</span></span> tensorflow<span style="color:#f8f8f2">.</span>keras<span style="color:#f8f8f2">.</span>layers <span style="color:#66d9ef"><span style="color:#f92672">as</span></span> kl<span style="color:#66d9ef"><span style="color:#f92672">class</span></span> <span style="color:#f8f8f2">ProbabilityDistribution</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">tf</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">.</span></span><span style="color:#f8f8f2">keras</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">.</span></span><span style="color:#f8f8f2">Model</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">call</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> logits</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># sample a random categorical action from given logits</span></span><span style="color:#66d9ef"><span style="color:#f92672">return</span></span> tf<span style="color:#f8f8f2">.</span>squeeze<span style="color:#f8f8f2">(</span>tf<span style="color:#f8f8f2">.</span>random<span style="color:#f8f8f2">.</span>categorical<span style="color:#f8f8f2">(</span>logits<span style="color:#f8f8f2">,</span> <span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span> axis<span style="color:#f8f8f2">=</span><span style="color:#f8f8f2"><span style="color:#ae81ff">-</span></span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span><span style="color:#66d9ef"><span style="color:#f92672">class</span></span> <span style="color:#f8f8f2">Model</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">tf</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">.</span></span><span style="color:#f8f8f2">keras</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">.</span></span><span style="color:#f8f8f2">Model</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">__init__</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> num_actions</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span>super<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">.</span>__init__<span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">'mlp_policy'</span></span><span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># no tf.get_variable(), just simple Keras API</span></span>self<span style="color:#f8f8f2">.</span>hidden1 <span style="color:#f8f8f2">=</span> kl<span style="color:#f8f8f2">.</span>Dense<span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">128</span></span><span style="color:#f8f8f2">,</span> activation<span style="color:#f8f8f2">=</span><span style="color:#a6e22e"><span style="color:#e6db74">'relu'</span></span><span style="color:#f8f8f2">)</span>self<span style="color:#f8f8f2">.</span>hidden2 <span style="color:#f8f8f2">=</span> kl<span style="color:#f8f8f2">.</span>Dense<span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">128</span></span><span style="color:#f8f8f2">,</span> activation<span style="color:#f8f8f2">=</span><span style="color:#a6e22e"><span style="color:#e6db74">'relu'</span></span><span style="color:#f8f8f2">)</span>self<span style="color:#f8f8f2">.</span>value <span style="color:#f8f8f2">=</span> kl<span style="color:#f8f8f2">.</span>Dense<span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">,</span> name<span style="color:#f8f8f2">=</span><span style="color:#a6e22e"><span style="color:#e6db74">'value'</span></span><span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># logits are unnormalized log probabilities</span></span>self<span style="color:#f8f8f2">.</span>logits <span style="color:#f8f8f2">=</span> kl<span style="color:#f8f8f2">.</span>Dense<span style="color:#f8f8f2">(</span>num_actions<span style="color:#f8f8f2">,</span> name<span style="color:#f8f8f2">=</span><span style="color:#a6e22e"><span style="color:#e6db74">'policy_logits'</span></span><span style="color:#f8f8f2">)</span>self<span style="color:#f8f8f2">.</span>dist <span style="color:#f8f8f2">=</span> ProbabilityDistribution<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">call</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> inputs</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># inputs is a numpy array, convert to Tensor</span></span>x <span style="color:#f8f8f2">=</span> tf<span style="color:#f8f8f2">.</span>convert_to_tensor<span style="color:#f8f8f2">(</span>inputs<span style="color:#f8f8f2">,</span> dtype<span style="color:#f8f8f2">=</span>tf<span style="color:#f8f8f2">.</span>float32<span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># separate hidden layers from the same input tensor</span></span>hidden_logs <span style="color:#f8f8f2">=</span> self<span style="color:#f8f8f2">.</span>hidden1<span style="color:#f8f8f2">(</span>x<span style="color:#f8f8f2">)</span>hidden_vals <span style="color:#f8f8f2">=</span> self<span style="color:#f8f8f2">.</span>hidden2<span style="color:#f8f8f2">(</span>x<span style="color:#f8f8f2">)</span><span style="color:#66d9ef"><span style="color:#f92672">return</span></span> self<span style="color:#f8f8f2">.</span>logits<span style="color:#f8f8f2">(</span>hidden_logs<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span> self<span style="color:#f8f8f2">.</span>value<span style="color:#f8f8f2">(</span>hidden_vals<span style="color:#f8f8f2">)</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">action_value</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> obs</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># executes call() under the hood</span></span>logits<span style="color:#f8f8f2">,</span> value <span style="color:#f8f8f2">=</span> self<span style="color:#f8f8f2">.</span>predict<span style="color:#f8f8f2">(</span>obs<span style="color:#f8f8f2">)</span>action <span style="color:#f8f8f2">=</span> self<span style="color:#f8f8f2">.</span>dist<span style="color:#f8f8f2">.</span>predict<span style="color:#f8f8f2">(</span>logits<span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># a simpler option, will become clear later why we don't use it</span></span><span style="color:slategray"><span style="color:#75715e"># action = tf.random.categorical(logits, 1)</span></span><span style="color:#66d9ef"><span style="color:#f92672">return</span></span> np<span style="color:#f8f8f2">.</span>squeeze<span style="color:#f8f8f2">(</span>action<span style="color:#f8f8f2">,</span> axis<span style="color:#f8f8f2">=</span><span style="color:#f8f8f2"><span style="color:#ae81ff">-</span></span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span> np<span style="color:#f8f8f2">.</span>squeeze<span style="color:#f8f8f2">(</span>value<span style="color:#f8f8f2">,</span> axis<span style="color:#f8f8f2">=</span><span style="color:#f8f8f2"><span style="color:#ae81ff">-</span></span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span></code></span>

驗證我們驗證模型是否按預期工作:

<span style="color:#f8f8f2"><code class="language-python"><span style="color:#66d9ef"><span style="color:#f92672">import</span></span> gym env <span style="color:#f8f8f2">=</span> gym<span style="color:#f8f8f2">.</span>make<span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">'CartPole-v0'</span></span><span style="color:#f8f8f2">)</span> model <span style="color:#f8f8f2">=</span> Model<span style="color:#f8f8f2">(</span>num_actions<span style="color:#f8f8f2">=</span>env<span style="color:#f8f8f2">.</span>action_space<span style="color:#f8f8f2">.</span>n<span style="color:#f8f8f2">)</span> obs <span style="color:#f8f8f2">=</span> env<span style="color:#f8f8f2">.</span>reset<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span> <span style="color:slategray"><span style="color:#75715e"># no feed_dict or tf.Session() needed at all</span></span> action<span style="color:#f8f8f2">,</span> value <span style="color:#f8f8f2">=</span> model<span style="color:#f8f8f2">.</span>action_value<span style="color:#f8f8f2">(</span>obs<span style="color:#f8f8f2">[</span><span style="color:#f92672">None</span><span style="color:#f8f8f2">,</span> <span style="color:#f8f8f2">:</span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">)</span> <span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span>action<span style="color:#f8f8f2">,</span> value<span style="color:#f8f8f2">)</span> <span style="color:slategray"><span style="color:#75715e"># [1] [-0.00145713]</span></span></code></span>

這里要注意的事項:

  • 模型層和執行路徑是分開定義的;
  • 沒有“輸入”圖層,模型將接受原始numpy數組;
  • 可以通過函數API在一個模型中定義兩個計算路徑;
  • 模型可以包含一些輔助方法,例如動作采樣;
  • 在eager的模式下,一切都可以從原始的numpy數組中運行;

隨機代理

現在我們可以繼續學習一些有趣的東西A2CAgent類。首先,讓我們添加一個貫穿整集的test方法并返回獎勵總和。

<span style="color:#f8f8f2"><code class="language-python"><span style="color:#66d9ef"><span style="color:#f92672">class</span></span> <span style="color:#f8f8f2">A2CAgent</span><span style="color:#f8f8f2">:</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">__init__</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> model</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span>self<span style="color:#f8f8f2">.</span>model <span style="color:#f8f8f2">=</span> model<span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">test</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> env</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> render</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">=</span></span><span style="color:#ae81ff"><span style="color:#f8f8f2">True</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span>obs<span style="color:#f8f8f2">,</span> done<span style="color:#f8f8f2">,</span> ep_reward <span style="color:#f8f8f2">=</span> env<span style="color:#f8f8f2">.</span>reset<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span> <span style="color:#ae81ff"><span style="color:#f92672">False</span></span><span style="color:#f8f8f2">,</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span><span style="color:#66d9ef"><span style="color:#f92672">while</span></span> <span style="color:#f8f8f2"><span style="color:#f92672">not</span></span> done<span style="color:#f8f8f2">:</span>action<span style="color:#f8f8f2">,</span> _ <span style="color:#f8f8f2">=</span> self<span style="color:#f8f8f2">.</span>model<span style="color:#f8f8f2">.</span>action_value<span style="color:#f8f8f2">(</span>obs<span style="color:#f8f8f2">[</span><span style="color:#f92672">None</span><span style="color:#f8f8f2">,</span> <span style="color:#f8f8f2">:</span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">)</span>obs<span style="color:#f8f8f2">,</span> reward<span style="color:#f8f8f2">,</span> done<span style="color:#f8f8f2">,</span> _ <span style="color:#f8f8f2">=</span> env<span style="color:#f8f8f2">.</span>step<span style="color:#f8f8f2">(</span>action<span style="color:#f8f8f2">)</span>ep_reward <span style="color:#f8f8f2">+=</span> reward<span style="color:#66d9ef"><span style="color:#f92672">if</span></span> render<span style="color:#f8f8f2">:</span>env<span style="color:#f8f8f2">.</span>render<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#66d9ef"><span style="color:#f92672">return</span></span> ep_reward</code></span>

讓我們看看我們的模型在隨機初始化權重下得分多少:

<span style="color:#f8f8f2"><code class="language-python">agent <span style="color:#f8f8f2">=</span> A2CAgent<span style="color:#f8f8f2">(</span>model<span style="color:#f8f8f2">)</span> rewards_sum <span style="color:#f8f8f2">=</span> agent<span style="color:#f8f8f2">.</span>test<span style="color:#f8f8f2">(</span>env<span style="color:#f8f8f2">)</span> <span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"%d out of 200"</span></span> <span style="color:#f8f8f2">%</span> rewards_sum<span style="color:#f8f8f2">)</span> <span style="color:slategray"><span style="color:#75715e"># 18 out of 200</span></span></code></span>

離最佳轉臺還有很遠,接下來是訓練部分!

損失/函數

正如我在DRL概述部分所描述的那樣,代理通過基于某些損失(目標)函數的梯度下降來改進其策略。在演員評論家中,我們訓練了三個目標:用優勢加權梯度加上熵最大化來改進策略,并最小化價值估計誤差。

<span style="color:#f8f8f2"><code class="language-python"><span style="color:#66d9ef"><span style="color:#f92672">import</span></span> tensorflow<span style="color:#f8f8f2">.</span>keras<span style="color:#f8f8f2">.</span>losses <span style="color:#66d9ef"><span style="color:#f92672">as</span></span> kls <span style="color:#66d9ef"><span style="color:#f92672">import</span></span> tensorflow<span style="color:#f8f8f2">.</span>keras<span style="color:#f8f8f2">.</span>optimizers <span style="color:#66d9ef"><span style="color:#f92672">as</span></span> ko <span style="color:#66d9ef"><span style="color:#f92672">class</span></span> <span style="color:#f8f8f2">A2CAgent</span><span style="color:#f8f8f2">:</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">__init__</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> model</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># hyperparameters for loss terms</span></span>self<span style="color:#f8f8f2">.</span>params <span style="color:#f8f8f2">=</span> <span style="color:#f8f8f2">{</span><span style="color:#a6e22e"><span style="color:#e6db74">'value'</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0.5</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">'entropy'</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0.0001</span></span><span style="color:#f8f8f2">}</span>self<span style="color:#f8f8f2">.</span>model <span style="color:#f8f8f2">=</span> modelself<span style="color:#f8f8f2">.</span>model<span style="color:#f8f8f2">.</span>compile<span style="color:#f8f8f2">(</span>optimizer<span style="color:#f8f8f2">=</span>ko<span style="color:#f8f8f2">.</span>RMSprop<span style="color:#f8f8f2">(</span>lr<span style="color:#f8f8f2">=</span><span style="color:#ae81ff"><span style="color:#ae81ff">0.0007</span></span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span><span style="color:slategray"><span style="color:#75715e"># define separate losses for policy logits and value estimate</span></span>loss<span style="color:#f8f8f2">=</span><span style="color:#f8f8f2">[</span>self<span style="color:#f8f8f2">.</span>_logits_loss<span style="color:#f8f8f2">,</span> self<span style="color:#f8f8f2">.</span>_value_loss<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">)</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">test</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> env</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> render</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">=</span></span><span style="color:#ae81ff"><span style="color:#f8f8f2">True</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># unchanged from previous section</span></span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">_value_loss</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> returns</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> value</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># value loss is typically MSE between value estimates and returns</span></span><span style="color:#66d9ef"><span style="color:#f92672">return</span></span> self<span style="color:#f8f8f2">.</span>params<span style="color:#f8f8f2">[</span><span style="color:#a6e22e"><span style="color:#e6db74">'value'</span></span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">*</span>kls<span style="color:#f8f8f2">.</span>mean_squared_error<span style="color:#f8f8f2">(</span>returns<span style="color:#f8f8f2">,</span> value<span style="color:#f8f8f2">)</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">_logits_loss</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> acts_and_advs</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> logits</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># a trick to input actions and advantages through same API</span></span>actions<span style="color:#f8f8f2">,</span> advantages <span style="color:#f8f8f2">=</span> tf<span style="color:#f8f8f2">.</span>split<span style="color:#f8f8f2">(</span>acts_and_advs<span style="color:#f8f8f2">,</span> <span style="color:#ae81ff"><span style="color:#ae81ff">2</span></span><span style="color:#f8f8f2">,</span> axis<span style="color:#f8f8f2">=</span><span style="color:#f8f8f2"><span style="color:#ae81ff">-</span></span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># polymorphic CE loss function that supports sparse and weighted options</span></span><span style="color:slategray"><span style="color:#75715e"># from_logits argument ensures transformation into normalized probabilities</span></span>cross_entropy <span style="color:#f8f8f2">=</span> kls<span style="color:#f8f8f2">.</span>CategoricalCrossentropy<span style="color:#f8f8f2">(</span>from_logits<span style="color:#f8f8f2">=</span><span style="color:#ae81ff"><span style="color:#f92672">True</span></span><span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># policy loss is defined by policy gradients, weighted by advantages</span></span><span style="color:slategray"><span style="color:#75715e"># note: we only calculate the loss on the actions we've actually taken</span></span><span style="color:slategray"><span style="color:#75715e"># thus under the hood a sparse version of CE loss will be executed</span></span>actions <span style="color:#f8f8f2">=</span> tf<span style="color:#f8f8f2">.</span>cast<span style="color:#f8f8f2">(</span>actions<span style="color:#f8f8f2">,</span> tf<span style="color:#f8f8f2">.</span>int32<span style="color:#f8f8f2">)</span>policy_loss <span style="color:#f8f8f2">=</span> cross_entropy<span style="color:#f8f8f2">(</span>actions<span style="color:#f8f8f2">,</span> logits<span style="color:#f8f8f2">,</span> sample_weight<span style="color:#f8f8f2">=</span>advantages<span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># entropy loss can be calculated via CE over itself</span></span>entropy_loss <span style="color:#f8f8f2">=</span> cross_entropy<span style="color:#f8f8f2">(</span>logits<span style="color:#f8f8f2">,</span> logits<span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># here signs are flipped because optimizer minimizes</span></span><span style="color:#66d9ef"><span style="color:#f92672">return</span></span> policy_loss <span style="color:#f8f8f2">-</span> self<span style="color:#f8f8f2">.</span>params<span style="color:#f8f8f2">[</span><span style="color:#a6e22e"><span style="color:#e6db74">'entropy'</span></span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">*</span>entropy_loss</code></span>

我們完成了目標函數!請注意代碼的緊湊程度:注釋行幾乎比代碼本身多。

代理訓練

最后,還有訓練回路本身,它相對較長,但相當簡單:收集樣本,計算回報和優勢,并在其上訓練模型。

<span style="color:#f8f8f2"><code class="language-python"><span style="color:#66d9ef"><span style="color:#f92672">class</span></span> <span style="color:#f8f8f2">A2CAgent</span><span style="color:#f8f8f2">:</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">__init__</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> model</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># hyperparameters for loss terms</span></span>self<span style="color:#f8f8f2">.</span>params <span style="color:#f8f8f2">=</span> <span style="color:#f8f8f2">{</span><span style="color:#a6e22e"><span style="color:#e6db74">'value'</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0.5</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">'entropy'</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0.0001</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">'gamma'</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0.99</span></span><span style="color:#f8f8f2">}</span><span style="color:slategray"><span style="color:#75715e"># unchanged from previous section</span></span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">train</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> env</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> batch_sz</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">=</span></span><span style="color:#ae81ff"><span style="color:#f8f8f2"><span style="color:#ae81ff">32</span></span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> updates</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">=</span></span><span style="color:#ae81ff"><span style="color:#f8f8f2"><span style="color:#ae81ff">1000</span></span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># storage helpers for a single batch of data</span></span>actions <span style="color:#f8f8f2">=</span> np<span style="color:#f8f8f2">.</span>empty<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">(</span>batch_sz<span style="color:#f8f8f2">,</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span> dtype<span style="color:#f8f8f2">=</span>np<span style="color:#f8f8f2">.</span>int32<span style="color:#f8f8f2">)</span>rewards<span style="color:#f8f8f2">,</span> dones<span style="color:#f8f8f2">,</span> values <span style="color:#f8f8f2">=</span> np<span style="color:#f8f8f2">.</span>empty<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">3</span></span><span style="color:#f8f8f2">,</span> batch_sz<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span>observations <span style="color:#f8f8f2">=</span> np<span style="color:#f8f8f2">.</span>empty<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">(</span>batch_sz<span style="color:#f8f8f2">,</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">+</span> env<span style="color:#f8f8f2">.</span>observation_space<span style="color:#f8f8f2">.</span>shape<span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># training loop: collect samples, send to optimizer, repeat updates times</span></span>ep_rews <span style="color:#f8f8f2">=</span> <span style="color:#f8f8f2">[</span><span style="color:#ae81ff"><span style="color:#ae81ff">0.0</span></span><span style="color:#f8f8f2">]</span>next_obs <span style="color:#f8f8f2">=</span> env<span style="color:#f8f8f2">.</span>reset<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#66d9ef"><span style="color:#f92672">for</span></span> update <span style="color:#66d9ef"><span style="color:#f92672">in</span></span> range<span style="color:#f8f8f2">(</span>updates<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">:</span><span style="color:#66d9ef"><span style="color:#f92672">for</span></span> step <span style="color:#66d9ef"><span style="color:#f92672">in</span></span> range<span style="color:#f8f8f2">(</span>batch_sz<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">:</span>observations<span style="color:#f8f8f2">[</span>step<span style="color:#f8f8f2">]</span> <span style="color:#f8f8f2">=</span> next_obs<span style="color:#f8f8f2">.</span>copy<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span>actions<span style="color:#f8f8f2">[</span>step<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">,</span> values<span style="color:#f8f8f2">[</span>step<span style="color:#f8f8f2">]</span> <span style="color:#f8f8f2">=</span> self<span style="color:#f8f8f2">.</span>model<span style="color:#f8f8f2">.</span>action_value<span style="color:#f8f8f2">(</span>next_obs<span style="color:#f8f8f2">[</span><span style="color:#f92672">None</span><span style="color:#f8f8f2">,</span> <span style="color:#f8f8f2">:</span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">)</span>next_obs<span style="color:#f8f8f2">,</span> rewards<span style="color:#f8f8f2">[</span>step<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">,</span> dones<span style="color:#f8f8f2">[</span>step<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">,</span> _ <span style="color:#f8f8f2">=</span> env<span style="color:#f8f8f2">.</span>step<span style="color:#f8f8f2">(</span>actions<span style="color:#f8f8f2">[</span>step<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">)</span>ep_rews<span style="color:#f8f8f2">[</span><span style="color:#f8f8f2"><span style="color:#ae81ff">-</span></span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">]</span> <span style="color:#f8f8f2">+=</span> rewards<span style="color:#f8f8f2">[</span>step<span style="color:#f8f8f2">]</span><span style="color:#66d9ef"><span style="color:#f92672">if</span></span> dones<span style="color:#f8f8f2">[</span>step<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">:</span>ep_rews<span style="color:#f8f8f2">.</span>append<span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">0.0</span></span><span style="color:#f8f8f2">)</span>next_obs <span style="color:#f8f8f2">=</span> env<span style="color:#f8f8f2">.</span>reset<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span>_<span style="color:#f8f8f2">,</span> next_value <span style="color:#f8f8f2">=</span> self<span style="color:#f8f8f2">.</span>model<span style="color:#f8f8f2">.</span>action_value<span style="color:#f8f8f2">(</span>next_obs<span style="color:#f8f8f2">[</span><span style="color:#f92672">None</span><span style="color:#f8f8f2">,</span> <span style="color:#f8f8f2">:</span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">)</span>returns<span style="color:#f8f8f2">,</span> advs <span style="color:#f8f8f2">=</span> self<span style="color:#f8f8f2">.</span>_returns_advantages<span style="color:#f8f8f2">(</span>rewards<span style="color:#f8f8f2">,</span> dones<span style="color:#f8f8f2">,</span> values<span style="color:#f8f8f2">,</span> next_value<span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># a trick to input actions and advantages through same API</span></span>acts_and_advs <span style="color:#f8f8f2">=</span> np<span style="color:#f8f8f2">.</span>concatenate<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">[</span>actions<span style="color:#f8f8f2">[</span><span style="color:#f8f8f2">:</span><span style="color:#f8f8f2">,</span> <span style="color:#f92672">None</span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">,</span> advs<span style="color:#f8f8f2">[</span><span style="color:#f8f8f2">:</span><span style="color:#f8f8f2">,</span> <span style="color:#f92672">None</span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">,</span> axis<span style="color:#f8f8f2">=</span><span style="color:#f8f8f2"><span style="color:#ae81ff">-</span></span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># performs a full training step on the collected batch</span></span><span style="color:slategray"><span style="color:#75715e"># note: no need to mess around with gradients, Keras API handles it</span></span>losses <span style="color:#f8f8f2">=</span> self<span style="color:#f8f8f2">.</span>model<span style="color:#f8f8f2">.</span>train_on_batch<span style="color:#f8f8f2">(</span>observations<span style="color:#f8f8f2">,</span> <span style="color:#f8f8f2">[</span>acts_and_advs<span style="color:#f8f8f2">,</span> returns<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">)</span><span style="color:#66d9ef"><span style="color:#f92672">return</span></span> ep_rews<span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">_returns_advantages</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> rewards</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> dones</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> values</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> next_value</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># next_value is the bootstrap value estimate of a future state (the critic)</span></span>returns <span style="color:#f8f8f2">=</span> np<span style="color:#f8f8f2">.</span>append<span style="color:#f8f8f2">(</span>np<span style="color:#f8f8f2">.</span>zeros_like<span style="color:#f8f8f2">(</span>rewards<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span> next_value<span style="color:#f8f8f2">,</span> axis<span style="color:#f8f8f2">=</span><span style="color:#f8f8f2"><span style="color:#ae81ff">-</span></span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span><span style="color:slategray"><span style="color:#75715e"># returns are calculated as discounted sum of future rewards</span></span><span style="color:#66d9ef"><span style="color:#f92672">for</span></span> t <span style="color:#66d9ef"><span style="color:#f92672">in</span></span> reversed<span style="color:#f8f8f2">(</span>range<span style="color:#f8f8f2">(</span>rewards<span style="color:#f8f8f2">.</span>shape<span style="color:#f8f8f2">[</span><span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">:</span>returns<span style="color:#f8f8f2">[</span>t<span style="color:#f8f8f2">]</span> <span style="color:#f8f8f2">=</span> rewards<span style="color:#f8f8f2">[</span>t<span style="color:#f8f8f2">]</span> <span style="color:#f8f8f2">+</span> self<span style="color:#f8f8f2">.</span>params<span style="color:#f8f8f2">[</span><span style="color:#a6e22e"><span style="color:#e6db74">'gamma'</span></span><span style="color:#f8f8f2">]</span> <span style="color:#f8f8f2">*</span> returns<span style="color:#f8f8f2">[</span>t<span style="color:#f8f8f2">+</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">]</span> <span style="color:#f8f8f2">*</span> <span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">-</span>dones<span style="color:#f8f8f2">[</span>t<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">)</span>returns <span style="color:#f8f8f2">=</span> returns<span style="color:#f8f8f2">[</span><span style="color:#f8f8f2">:</span><span style="color:#f8f8f2"><span style="color:#ae81ff">-</span></span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">]</span><span style="color:slategray"><span style="color:#75715e"># advantages are returns - baseline, value estimates in our case</span></span>advantages <span style="color:#f8f8f2">=</span> returns <span style="color:#f8f8f2">-</span> values<span style="color:#66d9ef"><span style="color:#f92672">return</span></span> returns<span style="color:#f8f8f2">,</span> advantages<span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">test</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> env</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> render</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">=</span></span><span style="color:#ae81ff"><span style="color:#f8f8f2">True</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># unchanged from previous section</span></span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">_value_loss</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> returns</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> value</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># unchanged from previous section</span></span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span><span style="color:#66d9ef"><span style="color:#f92672">def</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">_logits_loss</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">self</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> acts_and_advs</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">,</span></span><span style="color:#f8f8f2"> logits</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span><span style="color:#f8f8f2">:</span><span style="color:slategray"><span style="color:#75715e"># unchanged from previous section</span></span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span><span style="color:#f8f8f2">.</span></code></span>

訓練和

我們現在已經準備好在CartPole-v0上訓練我們的單工A2C代理了!訓練過程不應超過幾分鐘,訓練完成后,你應該看到代理成功達到200分中的目標。

<span style="color:#f8f8f2"><code class="language-python">rewards_history <span style="color:#f8f8f2">=</span> agent<span style="color:#f8f8f2">.</span>train<span style="color:#f8f8f2">(</span>env<span style="color:#f8f8f2">)</span> <span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"Finished training, testing..."</span></span><span style="color:#f8f8f2">)</span> <span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"%d out of 200"</span></span> <span style="color:#f8f8f2">%</span> agent<span style="color:#f8f8f2">.</span>test<span style="color:#f8f8f2">(</span>env<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:slategray"><span style="color:#75715e"># 200 out of 200</span></span></code></span>

?

在源代碼中,我包含了一些額外的幫助程序,可以打印出運行的獎勵和損失,以及rewards_history的基本繪圖儀。

態計

有了所有這種渴望模式的成功的喜悅,你可能想知道靜態圖形執行是否可以。當然!此外,我們還需要多一行代碼來啟用它!

<span style="color:#f8f8f2"><code class="language-python"><span style="color:#66d9ef"><span style="color:#f92672">with</span></span> tf<span style="color:#f8f8f2">.</span>Graph<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">.</span>as_default<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">:</span><span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span>tf<span style="color:#f8f8f2">.</span>executing_eagerly<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:slategray"><span style="color:#75715e"># False</span></span>model <span style="color:#f8f8f2">=</span> Model<span style="color:#f8f8f2">(</span>num_actions<span style="color:#f8f8f2">=</span>env<span style="color:#f8f8f2">.</span>action_space<span style="color:#f8f8f2">.</span>n<span style="color:#f8f8f2">)</span>agent <span style="color:#f8f8f2">=</span> A2CAgent<span style="color:#f8f8f2">(</span>model<span style="color:#f8f8f2">)</span>rewards_history <span style="color:#f8f8f2">=</span> agent<span style="color:#f8f8f2">.</span>train<span style="color:#f8f8f2">(</span>env<span style="color:#f8f8f2">)</span><span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"Finished training, testing..."</span></span><span style="color:#f8f8f2">)</span><span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"%d out of 200"</span></span> <span style="color:#f8f8f2">%</span> agent<span style="color:#f8f8f2">.</span>test<span style="color:#f8f8f2">(</span>env<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:slategray"><span style="color:#75715e"># 200 out of 200</span></span></code></span>

有一點需要注意,在靜態圖形執行期間,我們不能只有Tensors,這就是為什么我們在模型定義期間需要使用CategoricalDistribution的技巧。事實上,當我在尋找一種在靜態模式下執行的方法時,我發現了一個關于通過Keras API構建的模型的一個有趣的低級細節。

還有一件事

還記得我說過TensorFlow默認是運行在eager模式下吧,甚至用代碼片段證明它嗎?好吧,我錯了。

如果你使用Keras API來構建和管理模型,那么它將嘗試將它們編譯為靜態圖形。所以你最終得到的是靜態計算圖的性能,具有渴望執行的靈活性。

你可以通過model.run_eagerly標志檢查模型的狀態,你也可以通過設置此標志來強制執行eager模式變成True,盡管大多數情況下你可能不需要這樣做。但如果Keras檢測到沒有辦法繞過eager模式,它將自動退出。

為了說明它確實是作為靜態圖運行,這里是一個簡單的基準測試:

<span style="color:#f8f8f2"><code class="language-python"><span style="color:slategray"><span style="color:#75715e"># create a 100000 samples batch</span></span> env <span style="color:#f8f8f2">=</span> gym<span style="color:#f8f8f2">.</span>make<span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">'CartPole-v0'</span></span><span style="color:#f8f8f2">)</span> obs <span style="color:#f8f8f2">=</span> np<span style="color:#f8f8f2">.</span>repeat<span style="color:#f8f8f2">(</span>env<span style="color:#f8f8f2">.</span>reset<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">[</span><span style="color:#f92672">None</span><span style="color:#f8f8f2">,</span> <span style="color:#f8f8f2">:</span><span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">,</span> <span style="color:#ae81ff"><span style="color:#ae81ff">100000</span></span><span style="color:#f8f8f2">,</span> axis<span style="color:#f8f8f2">=</span><span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span><span style="color:#f8f8f2">)</span></code></span>

Eager基準

<span style="color:#f8f8f2"><code class="language-python"><span style="color:#f8f8f2">%</span><span style="color:#f8f8f2">%</span>time model <span style="color:#f8f8f2">=</span> Model<span style="color:#f8f8f2">(</span>env<span style="color:#f8f8f2">.</span>action_space<span style="color:#f8f8f2">.</span>n<span style="color:#f8f8f2">)</span> model<span style="color:#f8f8f2">.</span>run_eagerly <span style="color:#f8f8f2">=</span> <span style="color:#ae81ff"><span style="color:#f92672">True</span></span> <span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"Eager Execution: "</span></span><span style="color:#f8f8f2">,</span> tf<span style="color:#f8f8f2">.</span>executing_eagerly<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:#66d9ef">print</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"Eager Keras Model:"</span></span><span style="color:#f8f8f2">,</span> model<span style="color:#f8f8f2">.</span>run_eagerly<span style="color:#f8f8f2">)</span> _ <span style="color:#f8f8f2">=</span> model<span style="color:#f8f8f2">(</span>obs<span style="color:#f8f8f2">)</span> <span style="color:slategray"><span style="color:#75715e">######## Results #######</span></span> Eager Execution<span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#f92672">True</span></span> Eager Keras Model<span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#f92672">True</span></span> CPU times<span style="color:#f8f8f2">:</span> user <span style="color:#ae81ff"><span style="color:#ae81ff">639</span></span> ms<span style="color:#f8f8f2">,</span> sys<span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">736</span></span> ms<span style="color:#f8f8f2">,</span> total<span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">1.38</span></span> s</code></span>

基準

<span style="color:#f8f8f2"><code class="language-none">%%time with tf.Graph().as_default():model = Model(env.action_space.n)print("Eager Execution: ", tf.executing_eagerly())print("Eager Keras Model:", model.run_eagerly)_ = model.predict(obs) ######## Results ####### Eager Execution: False Eager Keras Model: False CPU times: user 793 ms, sys: 79.7 ms, total: 873 ms</code></span>

基準

<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-none">%%time model = Model(env.action_space.n) print("Eager Execution: ", tf.executing_eagerly()) print("Eager Keras Model:", model.run_eagerly) _ = model.predict(obs) ######## Results ####### Eager Execution: True Eager Keras Model: False CPU times: user 994 ms, sys: 23.1 ms, total: 1.02 s</code></span></span>

正如你所看到的,eager模式是靜態模式的背后,默認情況下,我們的模型確實是靜態執行的。

結論

希望本文能夠幫助你理解DRL和TensorFlow2.0。請注意,TensorFlow2.0仍然只是預覽版本,甚至不是候選版本,一切都可能發生變化。如果TensorFlow有什么東西你特別不喜歡,讓它的開發者知道

人們可能會有一個揮之不去的問題:TensorFlow比PyTorch好嗎?也許,也許不是。它們兩個都是偉大的庫,所以很難說這樣誰好,誰不好。如果你熟悉PyTorch,你可能已經注意到TensorFlow 2.0不僅趕上了它,而且還避免了一些PyTorch API的缺陷。

在任何一種情況下,對于開發者來說,這場競爭都已經為雙方帶來了積極的結果,我很期待看到未來的框架將會變成什么樣。

?

原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的TensorFlow 2.0深度强化学习指南的全部內容,希望文章能夠幫你解決所遇到的問題。

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

中文字幕精品一区二区精品 | 欧美日韩有码 | 黄色片网站免费 | 日韩理论在线观看 | 麻豆久久久久久久 | 在线免费观看视频 | 91精品国产99久久久久久久 | 欧美在线久久 | 激情片av | 免费看的黄网站软件 | 特黄特黄的视频 | 日韩大陆欧美高清视频区 | 黄色毛片一级 | 中文字幕在线日 | 成人欧美一区二区三区在线观看 | a一片一级 | 日本久久电影 | 国产又黄又硬又爽 | 亚洲婷婷网 | 欧产日产国产69 | 中文视频在线播放 | 天天综合天天综合 | 91视频麻豆 | 国产自产在线视频 | 99精品视频在线免费观看 | 精品亚洲va在线va天堂资源站 | 在线a亚洲视频播放在线观看 | 日韩丝袜在线观看 | 国产一区福利 | 久久精品高清视频 | 国产又黄又爽无遮挡 | 国产精品午夜久久久久久99热 | 国产高清在线一区 | 精品久久久久久国产91 | 日韩在线观看av | 日本午夜在线观看 | 91免费观看视频网站 | 国模视频一区二区三区 | 麻豆94tv免费版 | 在线高清一区 | 国产美女精彩久久 | 一级欧美一级日韩 | 99久久精品免费看国产四区 | a'aaa级片在线观看 | 麻豆影视在线播放 | 午夜少妇一区二区三区 | 国产成人高清 | 日韩免费| 国产精品18久久久久久首页狼 | 日日摸日日添日日躁av | 少妇搡bbb | 91天天操 | av福利在线免费观看 | 欧美精品亚洲二区 | 在线之家免费在线观看电影 | 超碰精品在线观看 | 国产精品久久久久四虎 | 国产高清免费观看 | 久久99久久99 | 日韩在线视频观看 | 亚洲 中文 欧美 日韩vr 在线 | 中文字幕亚洲欧美日韩 | 久久国产精品视频观看 | 久草在线免费看视频 | 免费观看黄| 六月丁香六月婷婷 | 日本在线免费看 | 中文字幕人成人 | 天天操天天舔天天爽 | 国产精品久久久久9999吃药 | 天天色天天综合网 | 在线看国产日韩 | 中文字幕在线观看免费 | 91精品国产欧美一区二区 | 一区二区影视 | 国产无套一区二区三区久久 | 丁香av| 国产精品18久久久久vr手机版特色 | 天天干天天草天天爽 | 91精品入口 | 久草视频免费在线播放 | 久久精品美女 | 98精品国产自产在线观看 | 在线观看岛国av | 午夜久久网站 | 欧美日韩综合在线观看 | 四虎国产精品免费 | 日韩av中文字幕在线免费观看 | 成年人在线视频观看 | 美女视频免费一区二区 | 国产在线第三页 | 久草精品电影 | 午夜18视频在线观看 | 欧美人人爱 | 久久久久国产一区二区三区 | 日韩黄色一级电影 | 国产精品1区 | 精久久久久 | 日韩中文字幕免费电影 | 91xav | 在线免费观看视频a | 国产精品99免视看9 国产精品毛片一区视频 | 精品美女久久久久 | 黄色福利视频网站 | 久久久久久久久久久成人 | 综合激情网| 99视频在线精品免费观看2 | 国产精品va在线观看入 | 精品国产一区二区三区免费 | free. 性欧美.com | 天天干夜夜想 | 六月色婷 | 亚洲视频电影在线 | 99久久爱 | 中文字幕久久精品 | 中文有码在线 | 美女网站一区 | 欧美在线一级片 | 波多野结衣在线观看视频 | 99精品久久99久久久久 | 九色91视频| 国产免费小视频 | 天天躁日日躁狠狠躁av中文 | 日韩精品免费在线 | 天天爽天天射 | 日韩色一区二区三区 | 国产精品精品久久久久久 | 日韩一级电影在线观看 | 日韩在线免费视频观看 | 91九色视频| 久久精品三| 亚洲免费成人av电影 | 免费看片成年人 | 一区二区三区精品久久久 | 四虎在线观看网址 | 久久伊人婷婷 | 欧美日韩国内在线 | 天天爽夜夜爽精品视频婷婷 | 麻豆视频免费入口 | 操夜夜操 | 国产精品 日韩 欧美 | 91视频高清完整版 | 中文字幕字幕中文 | 国产高清免费在线播放 | 欧美日韩在线观看不卡 | 超碰日韩在线 | 国产小视频在线看 | 国产视频精选 | 天天操天天摸天天干 | 亚洲精品在线观看的 | 天堂av色婷婷一区二区三区 | 丁香视频免费观看 | 婷婷五天天在线视频 | 日韩一三区| 成人av资源| 亚洲理论片在线观看 | 久久人91精品久久久久久不卡 | 亚洲精品国产精品国自产在线 | av免费在线观看网站 | 久久99国产精品视频 | 97免费公开视频 | 日韩在线国产精品 | 国产美女网站视频 | 久9在线| 欧美99热| 久久婷婷色综合 | 久久久国产成人 | 免费色视频网站 | 久久国产乱 | 91原创在线观看 | 国产偷国产偷亚洲清高 | 一区二区三区免费在线播放 | 亚洲激情在线视频 | av+在线播放在线播放 | 伊人影院99 | 在线色吧 | 日韩一区二区三区在线看 | 午夜视频99 | 久久国产精品久久国产精品 | 国产99久久九九精品免费 | 日韩免费网址 | 9在线观看免费高清完整版在线观看明 | 手机在线观看国产精品 | 欧美性成人 | 日韩精品免费一区二区三区 | 精品国产一区二区三区男人吃奶 | 久久久96 | 天天色天天骑天天射 | 五月天免费网站 | 99热这里只有精品8 久久综合毛片 | 少妇搡bbbb搡bbb搡忠贞 | 久久成熟| 色综合天天色 | 日韩久久在线 | 精品国产免费久久 | 91看片淫黄大片在线播放 | 国产在线精品观看 | av怡红院 | 国产录像在线观看 | 精品国产精品国产偷麻豆 | 美女av免费看 | 日本午夜在线亚洲.国产 | 日本在线中文在线 | 欧美日韩精品在线播放 | 激情图片久久 | 久久99久久99精品免观看粉嫩 | 曰本免费av | 国产在线观看 | 在线免费观看黄色 | 国产成a人亚洲精v品在线观看 | 免费久久99精品国产婷婷六月 | 久久综合精品一区 | 亚洲一区二区三区四区精品 | 亚洲在线色 | 狠狠色伊人亚洲综合网站色 | 激情av在线资源 | 久久爱综合 | 在线观看视频国产一区 | 国产精品久久久久久久7电影 | 亚洲日本色 | 三级黄色在线观看 | 亚洲精品国产综合99久久夜夜嗨 | 中文字幕一区二区三区四区 | 国产精品一区二区三区免费看 | 精品免费一区 | 亚洲国产视频a | 欧美国产日韩一区二区三区 | 欧美性色黄大片在线观看 | 18久久久久久| 日韩中出在线 | 欧美日韩中文字幕综合视频 | 丰满少妇在线观看网站 | 日韩网站中文字幕 | 国产亚洲精品久久久久久 | 91天堂素人约啪 | 三上悠亚一区二区在线观看 | 友田真希x88av | 狠狠干天天色 | 国产精品一区二区在线免费观看 | 国产精品白虎 | 成人午夜免费剧场 | 国产黄色一级片 | 五月婷婷亚洲 | 久久免费美女视频 | 亚洲成人一二三 | 色综合在 | 日本公妇在线观看 | 高潮毛片无遮挡高清免费 | 日韩中文字幕免费 | 中文字幕高清免费日韩视频在线 | 在线精品观看 | 天天操夜夜看 | 婷婷新五月 | 欧美日韩在线观看一区二区三区 | 狠狠干美女 | 久久久九九 | 激情文学综合丁香 | 中日韩三级视频 | 日韩成人黄色 | 美女视频免费一区二区 | 99精品福利 | 国产亚洲成人网 | 精品一区二区三区香蕉蜜桃 | 久草干 | 成人免费视频网站 | 91九色porny蝌蚪视频 | 又黄又爽又无遮挡免费的网站 | 国产麻豆精品传媒av国产下载 | 久久久久www | 97成人精品区在线播放 | 国产精品99免费看 | 精品免费久久久久 | 国产在线国偷精品产拍免费yy | 天天干天天操天天操 | 69中文字幕| 精品一区二区日韩 | 亚洲精品免费在线 | 日韩簧片在线观看 | 国产亚洲欧美精品久久久久久 | 狠狠色丁香婷婷综合橹88 | 日韩高清www | 国产综合91| 国产精品电影在线 | 久久久久久久久久久网站 | 超级碰碰视频 | 免费久久99精品国产婷婷六月 | 亚洲国产精品va在线看黑人 | 夜夜操天天操 | 久久激情视频 | 日韩理论片在线观看 | 99久久精品国产毛片 | 麻豆播放| 免费三级网 | 97超碰在线视 | 日韩在线观看第一页 | 国产最新视频在线观看 | 国产青草视频在线观看 | 国产小视频在线免费观看视频 | 亚洲成人午夜在线 | 国产精品久久久久久久久蜜臀 | 国产精品美女久久久久久 | 麻豆一级视频 | 水蜜桃亚洲一二三四在线 | 午夜精品av在线 | 色婷久久 | 男女激情麻豆 | 日韩免费在线视频观看 | 青青看片 | 久久好看免费视频 | 丁香视频全集免费观看 | 免费毛片一区二区三区久久久 | 99久久视频| 欧美精品在线观看免费 | 久草在线播放视频 | 亚洲专区一二三 | 91丨九色丨国产丨porny精品 | 久久久影院官网 | 午夜久久久久久久久 | 国产va饥渴难耐女保洁员在线观看 | 精品亚洲网 | 在线观看一级 | 丁香久久| 久久久免费看片 | 99久e精品热线免费 99国产精品久久久久久久久久 | av中文字幕在线观看网站 | 狠狠干激情 | 日本mv大片欧洲mv大片 | 偷拍福利视频一区二区三区 | 国产裸体bbb视频 | 国产一区二区不卡视频 | 免费在线观看国产精品 | 日韩在线观看视频在线 | 久久久精品免费观看 | 日本中文字幕在线观看 | 国产精品毛片 | 超碰国产在线播放 | 99精品视频免费在线观看 | 色狠狠狠 | 久久久久综合视频 | 久久亚洲影院 | 婷婷激情小说网 | av在线官网| 最近中文字幕视频完整版 | 日女人免费视频 | 综合久久五月天 | 日韩欧美在线综合网 | 天天操网站 | 96av在线 | av资源免费看 | 亚洲男男gⅴgay双龙 | 日韩欧美精品一区二区三区经典 | 久久xxxx| 色综合天天综合网国产成人网 | 欧美一级欧美一级 | 国产 一区二区三区 在线 | 亚洲视频免费在线 | 久久精品电影网 | 亚洲精品欧美精品 | 激情文学综合丁香 | 国产精品乱码久久久久 | 久草在线视频免赞 | 国产精品一区二区你懂的 | 欧美日韩不卡一区 | 日韩精品一区二区免费 | 国产91国语对白在线 | 特级西西人体444是什么意思 | 亚洲在线不卡 | 久久成人国产精品入口 | 一区中文字幕电影 | 337p西西人体大胆瓣开下部 | 久久久免费网站 | 久久久久看片 | 99精品偷拍视频一区二区三区 | 视频99爱 | 深爱激情av | 视频在线99| 精品一区二区三区电影 | 黄色av一区二区三区 | 五月天丁香综合 | 成人在线播放视频 | 欧美激情综合色综合啪啪五月 | 日韩在线无| av最新资源 | 日韩三级久久 | 六月色丁香 | 色在线免费| 亚洲高清激情 | 中文av字幕在线观看 | 九九九九热精品免费视频点播观看 | 久久国产精品第一页 | 在线观看成人毛片 | 中文字幕在线观看av | 亚洲成人av在线电影 | 美女视频黄的免费的 | 国产精品精品久久久 | 亚洲国产福利视频 | 国产精品九九久久99视频 | 国产精品福利小视频 | 999毛片| 伊人天堂久久 | 国产精品久久网 | 国产精品理论片在线观看 | 91丨九色丨国产丨porny精品 | 成人免费电影 | 成人久久 | 天天综合网天天综合色 | 欧美大片在线观看一区 | 九九热精品视频在线播放 | 伊人资源站 | av片在线观看 | 一级免费片 | 五月丁香| 日韩精品免费在线观看 | www.在线看片.com | 在线91视频 | a黄色一级片| 天天爽人人爽夜夜爽 | 国产一区二区在线观看免费 | 亚洲激情综合 | 日本一区二区免费在线观看 | 99久久精品国 | 欧美大片mv免费 | 久久97久久97精品免视看 | 黄av免费| 午夜三级在线 | 九九影视理伦片 | 免费成人在线网站 | 久久99精品国产一区二区三区 | 亚洲精品字幕在线 | 色视频在线观看 | 视频二区在线视频 | 亚洲在线视频观看 | 欧美在线观看视频一区二区三区 | 日日碰狠狠躁久久躁综合网 | 一级黄色片毛片 | 色吊丝在线永久观看最新版本 | 国产一级免费视频 | 免费的国产精品 | 成人午夜在线观看 | www.久久免费视频 | 精产嫩模国品一二三区 | 1000部国产精品成人观看 | 精品主播网红福利资源观看 | 成人av在线直播 | 亚洲狠狠丁香婷婷综合久久久 | 国产精品自产拍在线观看 | 狠狠操狠狠操 | 麻豆91精品| 麻豆视频在线免费看 | 精品一区 在线 | 中文字幕色播 | 国产免费亚洲高清 | 免费看三片 | 久草视频在线免费看 | 亚洲美女视频在线观看 | 色噜噜色噜噜 | 久久免费国产精品1 | 亚洲精品午夜视频 | 久青草电影 | 4p变态网欧美系列 | 96精品在线 | 黄色福利网| 69精品久久 | 欧美一级艳片视频免费观看 | 亚洲综合在线一区二区三区 | 日韩欧美在线免费观看 | 国产精品日韩欧美一区二区 | 久福利 | 在线观看国产区 | 人人爱爱人人 | 麻豆国产精品视频 | 四虎在线免费观看视频 | 在线播放 日韩专区 | 91tv国产成人福利 | 国产精品美女视频网站 | 日韩精品无 | 九九色在线观看 | 久久久久在线视频 | 免费在线观看91 | 这里只有精彩视频 | 国产精品第一页在线观看 | 久久电影网站中文字幕 | 久草电影网| 国产91精品一区二区麻豆网站 | 久久免费电影 | 在线视频在线观看 | 麻花豆传媒mv在线观看网站 | 日韩av影视在线观看 | 91精品区 | 黄色视屏免费在线观看 | 国产无遮挡猛进猛出免费软件 | 国产精品久久久久999 | 国产日韩一区在线 | 久久天天躁狠狠躁亚洲综合公司 | 欧美人牲 | 天天操天天舔天天爽 | 99久久久久久久 | 黄网站免费大全入口 | 在线免费观看羞羞视频 | 久久9999久久 | 9999免费视频 | 日韩久久视频 | 不卡av在线播放 | 亚洲精品国产欧美在线观看 | 伊人久久国产 | 狠狠综合久久av | 久久视频精品在线 | 国产精品久久久久久久久久妇女 | 久久免费视频4 | 亚洲视屏在线播放 | 成片免费 | 久草在线视频免费资源观看 | 婷婷网站天天婷婷网站 | 日日躁你夜夜躁你av蜜 | 亚洲美女视频在线观看 | 免费成人在线电影 | 欧美一进一出抽搐大尺度视频 | 天天色天天操综合 | 午夜精品久久久久久久99水蜜桃 | 欧美日本中文字幕 | 国产伦理一区 | 欧美激情综合五月色丁香小说 | 精品国产片 | 免费观看一级成人毛片 | 午夜视频在线观看一区二区三区 | 狠狠色婷婷丁香六月 | 中文资源在线播放 | 免费观看一级 | 激情综合久久 | 国产手机av在线 | 在线免费观看黄网站 | 精品久久网 | 亚洲成人国产 | 亚洲天堂激情 | 免费美女av| 久久久久久久网站 | 久久国产成人午夜av影院宅 | 99视频国产精品 | 亚洲激情六月 | a一片一级 | 精品主播网红福利资源观看 | 成人影片在线免费观看 | 中文字幕在线不卡国产视频 | 日韩激情片在线观看 | 在线免费观看羞羞视频 | 国产专区一| 福利网址在线观看 | 成人精品一区二区三区电影免费 | 亚洲电影免费 | 毛片网站免费在线观看 | 精品久久福利 | 91一区啪爱嗯打偷拍欧美 | 精品少妇一区二区三区在线 | 97在线视频免费观看 | 国产精品12 | av在线不卡观看 | 中文字幕在线播放第一页 | 国产xxxxx在线观看 | 欧美国产三区 | 天天射天天干天天插 | 伊人精品在线 | 美女久久视频 | 日本视频网 | 久草a在线| 国产精品 国内视频 | 亚洲精品动漫成人3d无尽在线 | 久久久久久久免费看 | 91av视频在线观看 | 国产91免费在线 | 欧美精品xxx | 中文字幕在线观看1 | 免费在线观看一级片 | 国产专区日韩专区 | 欧美男男tv网站 | 精品久久久久亚洲 | 亚洲欧美成人网 | 日韩和的一区二在线 | 涩涩网站在线播放 | 天天天天天天天天操 | 亚洲h在线播放在线观看h | 九九九热精品免费视频观看网站 | 色丁香久久 | 欧美视频二区 | 国产精品午夜久久 | 亚洲成人精品久久久 | 奇米网网址| 久久这里只精品 | av 一区 二区 久久 | 久久久视频在线 | 久久综合久久八八 | 久久综合九色综合欧美就去吻 | 97色综合| 干干干操操操 | 国产亚洲aⅴaaaaaa毛片 | 天天操 夜夜操 | 国产另类av | 国产一区二区精品91 | 99久久99久久综合 | 中文字幕有码在线播放 | 成人在线视频免费观看 | www.色爱| 国产高清不卡在线 | 99这里只有| 欧美一级黄色视屏 | 亚洲 欧美 91 | 九九九九九九精品任你躁 | 久久久亚洲国产精品麻豆综合天堂 | 天天干 夜夜操 | 日韩女同一区二区三区在线观看 | a视频在线看 | 国产亚洲精品久久19p | 91porny九色91啦中文 | av一级网站 | 日本中文字幕视频 | 91精品爽啪蜜夜国产在线播放 | 美女视频黄免费网站 | 五月婷婷久久丁香 | 国产999精品久久久久久绿帽 | 欧美成人视 | 狠狠色综合网站久久久久久久 | 天天操天天添 | 久久久免费播放 | 免费色黄| 欧美男同视频网站 | 免费福利片 | 欧美久久电影 | 三级黄在线 | 中文字幕成人一区 | 精品欧美小视频在线观看 | 国产一区二区在线免费播放 | 探花视频免费观看高清视频 | 欧美日韩1区 | 91九色精品 | 国产伦理久久精品久久久久_ | 黄色片网站 | 国产韩国日本高清视频 | 欧美一区日韩一区 | 国产乱码精品一区二区三区介绍 | 精品国产黄色片 | 91视频久久久久久 | 精品久久久999| 国产精品第一 | 91在线播放综合 | 欧美巨大 | 精品久久在线 | 久久99日韩 | 99精品国产免费久久久久久下载 | 国产成人福利片 | 日韩网站在线看片你懂的 | 在线观看国产成人av片 | 久久免费视频在线观看 | 免费视频区 | 久草在线播放视频 | 国产免费又粗又猛又爽 | 色网站在线 | 91在线视频 | www亚洲国产| 成人中文字幕+乱码+中文字幕 | 亚洲日本一区二区在线 | 五月天久久精品 | 国产成人av在线影院 | 综合色站导航 | 日韩精品中文字幕在线播放 | 伊人视频| 中文字幕在线观看视频一区 | 中文字幕第一页在线 | 精品欧美一区二区三区久久久 | 久久婷婷影视 | 国产一级小视频 | 午夜精品久久久久久久久久 | 国产精品一区二区在线看 | 99久e精品热线免费 99国产精品久久久久久久久久 | 亚洲精品免费在线视频 | 欧美精品一区在线 | 亚洲在线免费视频 | 91成人免费在线 | 日本中文字幕高清 | 久久久高清视频 | 夜色.com| 天天射天天射天天 | 天天躁日日躁狠狠躁av麻豆 | 男女精品久久 | 色香com.| 91色一区二区三区 | a在线播放 | 天天插狠狠干 | 在线播放 日韩专区 | 激情视频一区二区 | 特级毛片在线 | 国产精品毛片一区二区 | 蜜臀av网址| 成人av免费在线播放 | 91精品办公室少妇高潮对白 | 成片免费观看视频大全 | 在线免费黄网站 | 免费看黄在线看 | 国产精品视频地址 | 日韩一区二区三免费高清在线观看 | 欧美日韩观看 | 五月在线 | 黄色电影在线免费观看 | 成人在线黄色 | 久草免费在线观看 | 久久久久免费看 | 久久综合婷婷综合 | 日韩综合一区二区三区 | 久草观看视频 | 免费看一及片 | 免费欧美高清视频 | 色91在线视频 | 久久久91精品国产一区二区三区 | 99在线视频播放 | 免费久久片 | 日韩精品在线看 | 人人澡人人添人人爽一区二区 | 在线播放视频一区 | 久久久国产精品久久久 | 91热在线 | 免费国产ww | 亚洲男男gaygay无套 | 亚洲日本精品 | 日韩免费一区 | 久久手机精品视频 | 精品亚洲一区二区 | 日韩精品国产一区 | 黄色一级免费 | 一区二区三区高清在线观看 | 天天弄天天操 | 色综合天天狠天天透天天伊人 | 国产一区二区日本 | 国产精品美女久久久久久免费 | 天天操天天色天天 | 亚洲国产高清在线 | 成人黄色在线电影 | 日韩一区二区三区观看 | 国产麻豆视频网站 | 日韩视频区 | 99在线视频观看 | 亚州av网站| 国产香蕉在线 | 日本91在线 | 精品在线观看免费 | 久久成人在线视频 | 热久在线| 99久久精品久久久久久清纯 | 91视频xxxx| 天天爽天天碰狠狠添 | 久久激情视频 久久 | 免费黄色小网站 | 精品国产一区二区三区在线观看 | 在线免费观看欧美日韩 | 国产麻豆精品一区 | 亚洲精品国偷自产在线99热 | 91在线精品播放 | 天天干天天色2020 | 国产成人综合精品 | 麻豆传媒视频在线 | 国语精品久久 | 成年人国产在线观看 | av网站免费看 | 欧美一级片播放 | 欧美性黑人 | 国产黄色精品在线观看 | 久久艹久久| 国产成人免费在线观看 | 91av在线看| 97福利视频 | 亚洲国产精品va在线看 | 亚洲国产精品电影在线观看 | 亚洲综合爱 | 麻豆系列在线观看 | 天天在线免费视频 | 国产精品毛片一区二区在线 | 婷婷综合国产 | 色.www | 国产91综合一区在线观看 | 天天操天天摸天天干 | 欧美一级日韩三级 | 黄色免费网站大全 | 天天综合日日夜夜 | 日韩二区三区在线 | 亚洲一区日韩 | 在线欧美中文字幕 | www色| 国产手机视频精品 | 亚洲五月| 久久婷五月 | 久久免费高清 | 欧美久久久久久久久久久久久 | 伊人久久av| 青青河边草免费 | 综合网欧美 | 免费在线播放av电影 | 99久久9| ww亚洲ww亚在线观看 | 成人精品在线 | www久久99| 夜夜躁日日躁狠狠久久av | 五月综合激情 | 91麻豆精品国产自产在线 | 日本黄色片一区二区 | 黄色a在线 | 在线91色| 亚洲尺码电影av久久 | 国内精品视频免费 | 天天射天天色天天干 | 丁香在线观看完整电影视频 | 丝袜美腿在线播放 | 婷婷色亚洲 | 天躁狠狠躁 | 九九九国产 | 在线观看片 | 久久精品高清视频 | 天天做日日做天天爽视频免费 | 亚洲欧洲国产视频 | 亚洲成人家庭影院 | 日韩国产精品毛片 | 国产在线免费 | 中文字幕在线久一本久 | 全久久久久久久久久久电影 | 国产又粗又猛又黄视频 | 欧美与欧洲交xxxx免费观看 | 99国产精品久久久久久久久久 | 草樱av| 黄色成人免费电影 | 久久激情精品 | 日韩高清在线看 | www.色婷婷.com| 免费在线观看黄网站 | 国产精品免费在线观看视频 | 一区二区三区手机在线观看 | 国产一级免费av | 国内小视频在线观看 | 免费黄色一区 | 久久久国产日韩 | av福利在线| 国产精品国产三级国产aⅴ9色 | 亚洲成av人片在线观看无 | 在线成人小视频 | 91免费版在线观看 | 一级黄色片在线播放 | 成人小视频免费在线观看 | 日本特黄特色aaa大片免费 | 黄色的视频 | 成人一区二区三区在线观看 | 久久久一本精品99久久精品66 | 91久久精品一区二区三区 | 欧美成人69av | 日日躁夜夜躁xxxxaaaa | 亚洲国产日韩欧美 | 最近中文字幕国语免费高清6 | 国产一区不卡在线 | 国产在线高清视频 | 久久成人国产精品免费软件 | 色视频在线观看 | 国产精品免费在线播放 | 国产一区免费观看 | 午夜丁香视频在线观看 | 日韩免费电影在线观看 | 欧美吞精| 天天色成人网 | 人人草人人做 | 久久久久麻豆v国产 | 久久久91精品国产一区二区精品 | 99欧美精品 | 日韩系列 | 中文一区在线观看 | 国产精品18久久久久久久久久久久 | 国产精品亚洲成人 | 婷婷激情五月 | 最近中文字幕在线 | 国产中文视 | 欧美激情视频三区 | 深爱激情av | 91久久精品一区二区二区 | 人人爽人人 | 丁香六月激情 | 国产一区二三区好的 | 中文字幕高清有码 | 99精品视频免费观看视频 | 波多野结衣在线播放视频 | 97视频入口免费观看 | 久久这里只精品 | 日本最新中文字幕 | 麻豆网站免费观看 | 91 在线视频 | 免费日韩电影 | 97国产在线 | 免费成人黄色 | 久久免费久久 | 久久99这里只有精品 | 97在线精品国自产拍中文 | 国产精品精品国产 | 91麻豆精品国产91久久久更新时间 | 精品麻豆| 亚洲精品小视频 | 久久国产色| 热久久精品在线 | 最新午夜| 国产午夜精品一区二区三区四区 | 中文字幕一区二区三区视频 | 日韩天天综合 | 久久免费公开视频 | 久久婷婷视频 | 国产亚洲欧美精品久久久久久 | 24小时日本在线www免费的 | 五月激情丁香婷婷 | 久久久久久高清 | japanesexxx乱女另类 | 国产日韩精品一区二区 | 五月婷婷深开心 | 久久综合九色综合欧美狠狠 | 精品久久久成人 | 亚洲精品美女久久久 | 91亚洲精品久久久蜜桃网站 | 99热99re6国产在线播放 | 99超碰在线播放 | 国产流白浆高潮在线观看 | 96久久欧美麻豆网站 | 亚洲精品乱码久久久久久蜜桃动漫 | 黄色免费网战 | 人人搞人人干 | 久久久精品亚洲 | 天天操天天曰 | 成人欧美一区二区三区在线观看 | 一区二区三区四区五区在线视频 | 欧美另类巨大 | 欧美精品一区二区三区四区在线 | 啪啪肉肉污av国网站 | 国产手机视频精品 | 国产精品女同一区二区三区久久夜 | 日日夜夜综合网 | 成人91在线| 欧美性做爰猛烈叫床潮 | 久久久久高清毛片一级 | 天堂av观看 | 在线观看国产v片 | 亚洲国产视频网站 | 日韩中文字幕亚洲一区二区va在线 | 中文字幕免费一区 | 亚洲视频在线播放 | 亚洲精品在线视频网站 | 久久久久久久久久久综合 | bbb搡bbb爽爽爽 | 免费一级日韩欧美性大片 | 伊人久久五月天 | 国产视频手机在线 | 在线视频 国产 日韩 | 尤物97国产精品久久精品国产 | 亚洲涩涩网站 | 久久丁香 | 国内精品久久久精品电影院 | 国产性天天综合网 | 日日干夜夜干 | 91在线免费视频观看 | 国产精品久久久久久久久久久久久久 | 国产精品剧情 | 久久久久久久亚洲精品 | 99亚洲精品视频 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 国产做aⅴ在线视频播放 | 国产 在线 日韩 | 探花国产在线 | 欧洲精品码一区二区三区免费看 | 久久成年人网站 | 欧美在一区 | 亚洲精品999 | 99久久精品免费看国产一区二区三区 | 欧美污网站 | www亚洲国产 | 99精品国产一区二区 | 中文字幕亚洲精品日韩 | 免费视频久久久久久久 | 日韩中文字幕免费 | 综合久久婷婷 | 丰满少妇麻豆av | 97在线免费视频 | 中文字幕av在线免费 | 久久久一本精品99久久精品 | av福利在线免费观看 | 国产视频欧美视频 | 久久特级毛片 | 精品一区二区综合 | 国产欧美综合视频 | 国产日本亚洲高清 | 天天亚洲综合 | 色在线中文字幕 | 右手影院亚洲欧美 | 免费观看全黄做爰大片国产 | 涩五月婷婷 | 国产男女爽爽爽免费视频 | 丁香花在线观看视频在线 | 欧美激情精品久久久久 | 免费特级黄色片 | 国产精品二区在线 | 国产99爱| 中文字幕免费高清 | 亚洲电影毛片 |