色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

更好的理解TensorFlow 2.0的新特性

DPVg_AI_era ? 來源:lq ? 2019-01-23 09:20 ? 次閱讀

TensorFlow官方發布其2.0版本新性能以來,不少人可能對此會有些許困惑。因此博主Roman Ring寫了一篇概述性的文章,通過實現深度強化學習算法來具體的展示了TensorFlow 2.0的特性。

正所謂實踐出真知。

TensorFlow 2.0的特性公布已經有一段時間了,但很多人對此應當還是一頭霧水。

在本教程中,作者通過深度強化學習(DRL)來展示即將到來的TensorFlow 2.0的特性,具體來講就是通過實現優勢actor-critic(演員-評判家,A2C)智能體來解決經典的CartPole-v0環境。

雖然作者本文的目標是展示TensorFlow 2.0,但他先介紹了DRL方面的內容,包括對該領域的簡要概述。

事實上,由于2.0版本的主要關注點是簡化開發人員的工作,即易用性,所以現在正是使用TensorFlow進入DRL的好時機。

本文完整代碼資源鏈接:GitHub:https://github.com/inoryy/tensorflow2-deep-reinforcement-learning

Google Colab:https://colab.research.google.com/drive/12QvW7VZSzoaF-Org-u-N6aiTdBN5ohNA

安裝

由于TensorFlow 2.0仍處于試驗階段,建議將其安裝在一個獨立的(虛擬)環境中。我比較傾向于使用Anaconda,所以以此來做說明:

>condacreate-ntf2python=3.6>sourceactivatetf2>pipinstalltf-nightly-2.0-preview#tf-nightly-gpu-2.0-previewforGPUversion

讓我們來快速驗證一下,一切是否按著預測正常工作:

>>>importtensorflowastf>>>print(tf.__version__)1.13.0-dev20190117>>>print(tf.executing_eagerly())True

不必擔心1.13.x版本,這只是一個早期預覽。此處需要注意的是,默認情況下我們是處于eager模式的!

>>>print(tf.reduce_sum([1,2,3,4,5]))tf.Tensor(15,shape=(),dtype=int32)

如果讀者對eager模式并不熟悉,那么簡單來講,從本質上它意味著計算是在運行時(runtime)被執行的,而不是通過預編譯的圖(graph)來執行。讀者也可以在TensorFlow文檔中對此做深入了解:

https://www.tensorflow.org/tutorials/eager/eager_basics

深度強化學習

一般來說,強化學習是解決順序決策問題的高級框架。RL智能體通過基于某些觀察采取行動來導航環境,并因此獲得獎勵。大多數RL算法的工作原理是最大化智能體在一個軌跡中所收集的獎勵的總和。

基于RL的算法的輸出通常是一個策略—一個將狀態映射到操作的函數。有效的策略可以像硬編碼的no-op操作一樣簡單。隨機策略表示為給定狀態下行為的條件概率分布。

Actor-Critic方法

RL算法通常根據優化的目標函數進行分組。基于值的方法(如DQN)通過減少預期狀態-動作值(state-action value)的誤差來工作。

策略梯度(Policy Gradient)方法通過調整其參數直接優化策略本身,通常是通過梯度下降。完全計算梯度通常是很困難的,所以通常用蒙特卡洛(monte-carlo)方法來估計梯度。

最流行的方法是二者的混合:actor- critical方法,其中智能體策略通過“策略梯度”進行優化,而基于值的方法則用作期望值估計的引導。

深度actor- critical方法

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

異步優勢(asynchronous advantage) actor- critical

多年來,為了解決樣本效率和學習過程的穩定性問題,已經為此做出了一些改進。

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

其次,使用優勢函數代替原始回報。收益與基線(如狀態行動估計)之間的差異形成了優勢,可以將其視為與某一平均值相比某一給定操作有多好的衡量標準。

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

最后,并行使用多個worker來加速樣品采集,同時在訓練期間幫助將它們去相關(decorrelate)。

將所有這些變化與深度神經網絡結合起來,我們得到了兩種最流行的現代算法:異步優勢actor- critical算法,或簡稱A3C/A2C。兩者之間的區別更多的是技術上的而不是理論上的:顧名思義,它歸結為并行worker如何估計其梯度并將其傳播到模型中。

有了這些,我將結束我們的DRL方法之旅,因為這篇博客文章的重點是TensorFlow 2.0特性。如果您仍然不確定主題,不要擔心,通過代碼示例,一切都會變得更加清晰明了。

使用TensorFlow 2.0實現Advantage Actor-Critic

讓我們看看實現各種現代DRL算法的基礎是什么:是actor-critic agent,如前一節所述。為了簡單起見,我們不會實現并行worker,盡管大多數代碼都支持它。感興趣的讀者可以將這作為一個練習機會。

作為一個測試平臺,我們將使用CartPole-v0環境。雖然有點簡單,但它仍然是一個很好的選擇。

通過Keras模型API實現的策略和價值

首先,讓我們在單個模型類下創建策略和價值預估神經網絡:

importnumpyasnpimporttensorflowastfimporttensorflow.keras.layersasklclassProbabilityDistribution(tf.keras.Model):defcall(self,logits):#samplearandomcategoricalactionfromgivenlogitsreturntf.squeeze(tf.random.categorical(logits,1),axis=-1)classModel(tf.keras.Model):def__init__(self,num_actions):super().__init__('mlp_policy')#notf.get_variable(),justsimpleKerasAPIself.hidden1=kl.Dense(128,activation='relu')self.hidden2=kl.Dense(128,activation='relu')self.value=kl.Dense(1,name='value')#logitsareunnormalizedlogprobabilitiesself.logits=kl.Dense(num_actions,name='policy_logits')self.dist=ProbabilityDistribution()defcall(self,inputs):#inputsisanumpyarray,converttoTensorx=tf.convert_to_tensor(inputs,dtype=tf.float32)#separatehiddenlayersfromthesameinputtensorhidden_logs=self.hidden1(x)hidden_vals=self.hidden2(x)returnself.logits(hidden_logs),self.value(hidden_vals)defaction_value(self,obs):#executescall()underthehoodlogits,value=self.predict(obs)action=self.dist.predict(logits)#asimpleroption,willbecomeclearlaterwhywedon'tuseit#action=tf.random.categorical(logits,1)returnnp.squeeze(action,axis=-1),np.squeeze(value,axis=-1)

然后驗證模型是否如預期工作:

importgymenv=gym.make('CartPole-v0')model=Model(num_actions=env.action_space.n)obs=env.reset()#nofeed_dictortf.Session()neededatallaction,value=model.action_value(obs[None,:])print(action,value)#[1][-0.00145713]

這里需要注意的是:

模型層和執行路徑是分別定義的

沒有“輸入”層,模型將接受原始numpy數組

通過函數API可以在一個模型中定義兩個計算路徑

模型可以包含一些輔助方法,比如動作采樣

在eager模式下,一切都可以從原始numpy數組中運行

Random Agent

現在讓我們轉到 A2CAgent 類。首先,讓我們添加一個 test 方法,該方法運行完整的episode并返回獎勵的總和。

classA2CAgent:def__init__(self,model):self.model=modeldeftest(self,env,render=True):obs,done,ep_reward=env.reset(),False,0whilenotdone:action,_=self.model.action_value(obs[None,:])obs,reward,done,_=env.step(action)ep_reward+=rewardifrender:env.render()returnep_reward

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

agent=A2CAgent(model)rewards_sum=agent.test(env)print("%doutof200"%rewards_sum)#18outof200

離最佳狀態還很遠,接下來是訓練部分!

損失/目標函數

正如我在DRL概述部分中所描述的,agent通過基于某些損失(目標)函數的梯度下降來改進其策略。在 actor-critic 中,我們針對三個目標進行訓練:利用優勢加權梯度加上熵最大化來改進策略,以及最小化價值估計誤差。

importtensorflow.keras.lossesasklsimporttensorflow.keras.optimizersaskoclassA2CAgent:def__init__(self,model):#hyperparametersforlosstermsself.params={'value':0.5,'entropy':0.0001}self.model=modelself.model.compile(optimizer=ko.RMSprop(lr=0.0007),#defineseparatelossesforpolicylogitsandvalueestimateloss=[self._logits_loss,self._value_loss])deftest(self,env,render=True):#unchangedfromprevioussection...def_value_loss(self,returns,value):#valuelossistypicallyMSEbetweenvalueestimatesandreturnsreturnself.params['value']*kls.mean_squared_error(returns,value)def_logits_loss(self,acts_and_advs,logits):#atricktoinputactionsandadvantagesthroughsameAPIactions,advantages=tf.split(acts_and_advs,2,axis=-1)#polymorphicCElossfunctionthatsupportssparseandweightedoptions#from_logitsargumentensurestransformationintonormalizedprobabilitiescross_entropy=kls.CategoricalCrossentropy(from_logits=True)#policylossisdefinedbypolicygradients,weightedbyadvantages#note:weonlycalculatethelossontheactionswe'veactuallytaken#thusunderthehoodasparseversionofCElosswillbeexecutedactions=tf.cast(actions,tf.int32)policy_loss=cross_entropy(actions,logits,sample_weight=advantages)#entropylosscanbecalculatedviaCEoveritselfentropy_loss=cross_entropy(logits,logits)#heresignsareflippedbecauseoptimizerminimizesreturnpolicy_loss-self.params['entropy']*entropy_loss

我們完成了目標函數!注意代碼非常緊湊:注釋行幾乎比代碼本身還多。

Agent Training Loop

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

classA2CAgent:def__init__(self,model):#hyperparametersforlosstermsself.params={'value':0.5,'entropy':0.0001,'gamma':0.99}#unchangedfromprevioussection...deftrain(self,env,batch_sz=32,updates=1000):#storagehelpersforasinglebatchofdataactions=np.empty((batch_sz,),dtype=np.int32)rewards,dones,values=np.empty((3,batch_sz))observations=np.empty((batch_sz,)+env.observation_space.shape)#trainingloop:collectsamples,sendtooptimizer,repeatupdatestimesep_rews=[0.0]next_obs=env.reset()forupdateinrange(updates):forstepinrange(batch_sz):observations[step]=next_obs.copy()actions[step],values[step]=self.model.action_value(next_obs[None,:])next_obs,rewards[step],dones[step],_=env.step(actions[step])ep_rews[-1]+=rewards[step]ifdones[step]:ep_rews.append(0.0)next_obs=env.reset()_,next_value=self.model.action_value(next_obs[None,:])returns,advs=self._returns_advantages(rewards,dones,values,next_value)#atricktoinputactionsandadvantagesthroughsameAPIacts_and_advs=np.concatenate([actions[:,None],advs[:,None]],axis=-1)#performsafulltrainingsteponthecollectedbatch#note:noneedtomessaroundwithgradients,KerasAPIhandlesitlosses=self.model.train_on_batch(observations,[acts_and_advs,returns])returnep_rewsdef_returns_advantages(self,rewards,dones,values,next_value):#next_valueisthebootstrapvalueestimateofafuturestate(thecritic)returns=np.append(np.zeros_like(rewards),next_value,axis=-1)#returnsarecalculatedasdiscountedsumoffuturerewardsfortinreversed(range(rewards.shape[0])):returns[t]=rewards[t]+self.params['gamma']*returns[t+1]*(1-dones[t])returns=returns[:-1]#advantagesarereturns-baseline,valueestimatesinourcaseadvantages=returns-valuesreturnreturns,advantagesdeftest(self,env,render=True):#unchangedfromprevioussection...def_value_loss(self,returns,value):#unchangedfromprevioussection...def_logits_loss(self,acts_and_advs,logits):#unchangedfromprevioussection...

訓練&結果

我們現在已經準備好在CartPole-v0上訓練這個single-worker A2C agent!訓練過程應該只用幾分鐘。訓練結束后,你應該看到一個智能體成功地實現了200分的目標。

rewards_history=agent.train(env)print("Finishedtraining,testing...")print("%doutof200"%agent.test(env))#200outof200

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

靜態計算圖

eager mode效果這么好,你可能會想知道靜態圖執行是否也可以。當然是可以!而且,只需要多加一行代碼就可以啟用靜態圖執行。

withtf.Graph().as_default():print(tf.executing_eagerly())#Falsemodel=Model(num_actions=env.action_space.n)agent=A2CAgent(model)rewards_history=agent.train(env)print("Finishedtraining,testing...")print("%doutof200"%agent.test(env))#200outof200

有一點需要注意的是,在靜態圖執行期間,我們不能只使用 Tensors,這就是為什么我們需要在模型定義期間使用CategoricalDistribution的技巧。

One More Thing…

還記得我說過TensorFlow在默認情況下以eager 模式運行,甚至用一個代碼片段來證明它嗎?好吧,我騙了你。

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

你可以通過model.run_eager標志檢查模型的狀態,還可以通過將此標志設置為True來強制使用eager mode,盡管大多數情況下可能不需要這樣做——如果Keras檢測到沒有辦法繞過eager mode,它將自動退出。

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

#createa100000samplesbatchenv=gym.make('CartPole-v0')obs=np.repeat(env.reset()[None,:],100000,axis=0)

Eager Benchmark

%%timemodel=Model(env.action_space.n)model.run_eagerly=Trueprint("EagerExecution:",tf.executing_eagerly())print("EagerKerasModel:",model.run_eagerly)_=model(obs)########Results#######EagerExecution:TrueEagerKerasModel:TrueCPUtimes:user639ms,sys:736ms,total:1.38s

Static Benchmark

%%timewithtf.Graph().as_default():model=Model(env.action_space.n)print("EagerExecution:",tf.executing_eagerly())print("EagerKerasModel:",model.run_eagerly)_=model.predict(obs)########Results#######EagerExecution:FalseEagerKerasModel:FalseCPUtimes:user793ms,sys:79.7ms,total:873ms

Default Benchmark

%%timemodel=Model(env.action_space.n)print("EagerExecution:",tf.executing_eagerly())print("EagerKerasModel:",model.run_eagerly)_=model.predict(obs)########Results#######EagerExecution:TrueEagerKerasModel:FalseCPUtimes:user994ms,sys:23.1ms,total:1.02s

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

結論

希望本文對理解DRL和即將到來的TensorFlow 2.0有所幫助。請注意,TensorFlow 2.0仍然只是預覽版的,一切都有可能發生變化,如果你對TensorFlow有什么特別不喜歡(或喜歡:))的地方,請反饋給開發者

一個總被提起的問題是,TensorFlow是否比PyTorch更好?也許是,也許不是。兩者都是很好的庫,所以很難說是哪一個更好。如果你熟悉PyTorch,你可能會注意到TensorFlow 2.0不僅趕上了它,而且還避免了PyTorch API的一些缺陷。

無論最后誰勝出,對于開發者來說,這場競爭給雙方都帶來了凈積極的結果,我很期待看到這些框架未來會變成什么樣子。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 智能體
    +關注

    關注

    1

    文章

    163

    瀏覽量

    10600
  • 強化學習
    +關注

    關注

    4

    文章

    268

    瀏覽量

    11275
  • tensorflow
    +關注

    關注

    13

    文章

    329

    瀏覽量

    60577

原文標題:詳解深度強化學習展現TensorFlow 2.0新特性(代碼)

文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    有效的TensorFlow理解靜態和動態形狀

    【譯】Effective TensorFlow Chapter2——理解靜態和動態形狀
    發表于 04-10 12:42

    TensorFlow是什么

    來發現和理解瀕臨滅絕的海牛。一位日本農民運用 TensorFlow 開發了一個應用程序,使用大小和形狀等物理特性對黃瓜進行分類。使用 TensorFlow 的項目還有很多。本教程旨在
    發表于 07-22 10:14

    TensorFlow的特點和基本的操作方式

    2015年11月在GitHub上開源,在2016年4月補充了分布式版本,最新版本為1.10,2018年下半年將發布Tensorflow 2.0預覽版。Tensorflow目前仍處于快速開發迭代中,不斷推出新功能和優化性能,現已成
    發表于 11-23 09:56

    以Go綁定實例理解TensorFlow

    本文通過一個簡單的Go綁定實例,讓讀者一步一步地學習到Tensorflow有關ID、作用域、類型等方面的知識。以下是譯文。 Tensorflow并不是機器學習方面專用的庫,而是一個使用圖來表示計算
    發表于 09-28 17:42 ?0次下載
    以Go綁定實例<b class='flag-5'>理解</b><b class='flag-5'>TensorFlow</b>

    TensorFlow2.0 版本將來臨

    TensorFlow 2.0 的一部分,我們將停止分發 tf.contrib。我們將在未來幾個月與 contrib 模塊的所有者合作制定詳細的遷移計劃,包括如何在我們的社區頁面和文檔中宣傳您的 TensorFlow 擴展。
    的頭像 發表于 08-15 09:01 ?5529次閱讀

    Keras和TensorFlow究竟哪個會更好

    Keras 依然作為一個庫,與 TensorFlow 分開,進行獨立操作,所以仍存在未來兩者會分開的可能性;然而,我們知道 Google 官方同時支持 Keras 和 TensorFlow,分開似乎又是極不可能發生的。
    的頭像 發表于 10-11 10:05 ?2.2w次閱讀

    TensorFlow和Keras哪個更好用?

    作為一個庫,Keras 仍然可以單獨使用,因此未來兩者可能會分道揚鑣。不過,因為谷歌官方支持 Keras 和 TensorFlow,所以似乎不太可能出現這種情況。
    的頭像 發表于 10-31 09:40 ?1.1w次閱讀

    機器學習框架Tensorflow 2.0的這些新設計你了解多少

    總是無法被撼動。而就在即將到來的2019年,Tensorflow 2.0將正式入場,給暗流涌動的框架之爭再燃一把火。
    的頭像 發表于 11-17 11:33 ?3175次閱讀

    TensorFlow 2.0馬上要來了,還不速來了解下新架構?

    TensorFlow始終為生產提供了直接部署方式。無論是部署在服務器、邊緣設備還是Web上,TensorFlow都可以讓用戶對模型實現輕松訓練和部署。無論用戶使用何種語言或平臺。在TensorFlow
    的頭像 發表于 01-16 08:45 ?2940次閱讀
    <b class='flag-5'>TensorFlow</b> <b class='flag-5'>2.0</b>馬上要來了,還不速來了解下新架構?

    TensorFlow 2.0最佳實踐及主要變化

    由于能夠自由地穿插 Python 和 TensorFlow 代碼,您能夠充分利用 Python 的表現力。而且,可移植的 TensorFlow 在沒有 Python 解釋器的情況下也可執行。比如
    的頭像 發表于 02-18 09:34 ?3899次閱讀

    TensorFlow 2.0 將包含許多 API 變更

    此外,由于我們棄用了某些模塊(例如 tf.flags 和 tf.contrib),您將無法通過切換至 compat.v1 來實現 TensorFlow 2.0 中的某些變更。升級使用這些模塊的代碼
    的頭像 發表于 03-01 09:36 ?5573次閱讀

    TensorFlow2.0終于問世,Alpha版可以搶先體驗

    之前開發者反饋,希望TensorFlow能夠簡化API、減少冗余并改進文檔和示例。這次2.0發布,聽取了開發者的建議,因此新版本有以下三大特點:簡單、強大、可拓展。
    的頭像 發表于 03-08 09:30 ?3652次閱讀
    <b class='flag-5'>TensorFlow2.0</b>終于問世,Alpha版可以搶先體驗

    TensorFlow 2.0 alpha提供即將發生的變化的預覽

    要快速上手 TensorFlow 2.0 Alpha 版,最佳途徑是前往 TensorFlow 的新網站。您可以在 tensorflow.org/alpha 上找到 Alpha 版的教
    的頭像 發表于 03-10 10:17 ?2959次閱讀

    TensorFlow的11個使用技巧整理說明

    在本文中,我們將探索TF 2.0的10個功能,這些功能讓TensorFlow的使用更加順暢,減少了代碼行并提高了效率,因為這些函數/類屬于TensorFlow API。
    發表于 05-20 08:00 ?3次下載
    <b class='flag-5'>TensorFlow</b>的11個使用技巧整理說明

    tensorflow能做什么_tensorflow2.0和1.0區別

     TensorFlow是谷歌基于DistBelief進行研發的第二_代人工智能學習系統,其命名來源于本身的運行原理。Tensor (張量)意味著N維數組, Flow (流)意味著基于數據流圖的計算
    的頭像 發表于 12-04 14:45 ?8055次閱讀
    主站蜘蛛池模板: 三级电影免费看| 久久久久久久免费| 国产成人8x视频一区二区| 国产真实女人一级毛片| 亚洲 日韩 欧美 国产专区| 日本一本二本三区免费免费高清| 小草高清视频免费直播| 99久久香蕉| 黑人 尺寸 强行害怕 痛哭| 欧美一区二区激情视频| 青娱国产区在线| 视频一区国产在线二区| 中文字幕亚洲男人的天堂网络 | 拍床戏被肉高H纯肉H在水| 亚洲精品久久午夜麻豆| 成人在线视频观看| 男人J进女人P| 一级做a爰片久久毛片免费| 国产成人无码视频一区二区三区| 脔到她哭H粗话HWWW男男动漫| 嫩草影院在线观看精品视频| 亚洲欧美国产综合在线一区| 干丝袜美女| 国内精品日本久久久久影院| 日本久久免费大片| 97视频免费在线| 久久国产精品高清一区二区三区 | 精品久久电影网| 小妇人电影免费完整观看2021| Y8848高清私人影院软件优势| 伦理 电影在线观看| 在线成人精品国产区免费| 黄色网址在线播放| 性派对xxxhd| 国产乱国产乱老熟300部视频| 天天看高清影视在线18| 伊人久久影院| 久草在线精彩免费视频| 亚洲免费人成 久久| 国产人妻人伦精品久久无码| 午夜插插插|