# 十二、深度強化學習
在本章中,我們將以略有不同的方式使用深度神經網絡。 我們將要構建一個智能體,而不是預測一個類的成員,估計一個值,甚至生成一個序列。 盡管機器學習和人工智能這兩個術語經常互換使用,但在本章中,我們將討論人工智能作為一種可以感知其環境的智能體,并采取步驟在該環境中實現某些目標。
想象一個可以玩象棋或圍棋之類策略游戲的特工。 構建神經網絡來解決此類游戲的一種非常幼稚的方法可能是使用一種網絡架構,在該架構中,我們對每個可能的棋盤/棋子組合進行熱編碼,然后預測每個可能的下一個動作。 盡管該網絡龐大而復雜,但可能做得并不好。 要很好地玩國際象棋,您不僅要考慮下一步,而且還要考慮接下來的步伐。 在不確定的情況下,我們的智能體將需要考慮給定未來行動的最佳下一步行動。
這是一個令人興奮的領域。 正是在智能體領域,研究人員才朝著人工智能或強大的 AI 邁進,這是創建可以執行人類任何智力任務的智能體的崇高目標。 強 AI 的概念通常與弱 AI 形成對比,弱 AI 是解決某些單個任務或應用的能力。
對于作者(我)和讀者(您)而言,本章將是一個挑戰,因為強化學習理應擁有自己的書,并且需要總結在數學,心理學和計算機科學方面所做的工作。 因此,請原諒快速參考處理,并知道我在為您提供足夠的信息,而在接下來的部分中將不多說。
強化學習,馬爾可夫決策過程和 Q 學習是智能體的基礎,我們接下來將討論這些內容。
我們將在本章中討論以下主題:
* 強化學習概述
* Keras 強化學習框架
* 在 Keras 中建立強化學習智能體
# 強化學習概述
強化學習基于智能體的概念。 智能體通過觀察某種狀態然后采取行動來與其環境進行交互。 當智能體采取行動在狀態之間移動時,它會以獎勵信號的形式接收有關其行動良好性的反饋。 這個獎勵信號是強化學習中的強化。 這是一個反饋循環,智能體可以使用它來學習其選擇的優勢。 當然,獎勵可以是正面的,也可以是負面的(懲罰)。
想象一下,無人駕駛汽車是我們正在制造的智能體。 在行駛過程中,它不斷收到動作的獎勵信號。 留在車道內可能會產生積極的報酬,而在行人上奔跑可能會給智能體帶來非常消極的報酬。 當面臨選擇留在行人或撞到行人的選擇時,智能體將希望學會以避開行人為代價,避開行人,損失車道線獎勵,以避免更大的行人碰撞懲罰。
強化學習概念的核心是狀態,行為和獎勵的概念。 我已經討論過獎勵,所以讓我們談談行動和狀態。 動作是智能體在觀察到某種狀態時可以執行的操作。 如果我們的特工正在玩一個簡單的棋盤游戲,那么該動作將由該特工輪到它來做。 然后轉彎就是座席的狀態。 為了解決這些問題,我們將在這里著眼于一個智能體可以采取的行動始終是有限的和離散的。 下圖說明了此概念:

此反饋循環的一個步驟可以用數學方式表示為:

動作會在原始狀態`s`和下一個狀態`s'`的智能體之間進行轉換,智能體會在其中獲得一些獎勵`r`。 智能體選擇動作的方式稱為**智能體策略**,通常稱為`pi`。
強化學習的目的是找到一系列動作,使行動者從一個狀態到另一個狀態,并獲得盡可能多的報酬。
# 馬爾可夫決策過程
我們構筑的這個世界恰好是**馬爾可夫決策過程**(**MDP**),它具有以下屬性:
* 它具有一組有限的狀態,`S`
* 它具有一組有限的動作 `A`
* `P[a](s, s')`是采取行動`A`將在狀態`s`和狀態`s'`之間轉換的概率
* `R[a](s, s')`是`s`和`s'`之間過渡的直接獎勵。
* `γ ∈ [0, 1]`是折扣因子,這是我們相對于當前獎勵對未來獎勵的折扣程度(稍后會詳細介紹)
一旦我們有了確定每個狀態要采取的操作的策略函數`pi`,MDP 就解決了,成為了馬爾可夫鏈。
好消息是,有一個警告就完全有可能完美解決 MDP。 需要注意的是,必須知道 MDP 的所有回報和概率。 事實證明,這種警告相當重要,因為在大多數情況下,由于智能體的環境混亂或至少不確定,因此智能體不知道所有的回報和狀態更改概率。
# Q 學習
想象一下,我們有一些函數`Q`,可以估計出采取行動的回報:

對于某些狀態`s`以及動作`a`,它會根據狀態為該動作生成獎勵。 如果我們知道環境帶來的所有回報,那么我們就可以遍歷`Q`并選擇能夠為我們帶來最大回報的行動。 但是,正如我們在上一節中提到的那樣,我們的智能體不知道所有的獎勵狀態和狀態概率。 因此,我們的`Q`函數需要嘗試近似獎勵。
我們可以使用稱為 **Bellman 公式**的遞歸定義的`Q`函數來近似此理想的`Q`函數:

在這種情況下, `r[0]`是下一個動作的獎勵,然后在下一個動作上(遞歸地)遞歸使用`Q`函數確定該行動的未來獎勵。 為此,我們將`γ`作為相對于當前獎勵的未來獎勵的折扣。 只要伽瑪小于 1,它就不會使我們的獎勵序列變得無限大。 更明顯地,與當前狀態下的相同獎勵相比,未來狀態下的獎勵的值要低。 具體來說,如果有人今天給您 100 美元,明天給您 100 美元,您應該立即拿走這筆錢,因為明天不確定。
如果我們盡最大的努力讓我們的智能體經歷每種可能的狀態轉換,并使用此函數來估計我們的報酬,我們將得出我們試圖近似的理想`Q`函數。
# 無限狀態空間
對`Q`函數的討論使我們陷入了傳統強化學習的重要局限。 您可能還記得,它假設狀態空間是有限且離散的。 不幸的是,這不是我們生活的世界,也不是我們的智能體在很多時候會發現自己的環境。 考慮一個可以打乒乓球的經紀人。 狀態空間的重要組成部分是乒乓球的速度,它當然不是離散的。 像我們不久將要看到的那樣,可以看到的特工會看到一個圖像,該圖像是一個很大的連續空間。
我們討論的 Bellman 方程將要求我們在狀態與狀態之間轉移時保持經驗獎勵的大矩陣。 但是,當面對連續的狀態空間時,這是不可能的。 可能的狀態本質上是無限的,我們不能創建無限大小的矩陣。
幸運的是,我們可以使用深度神經網絡來近似`Q`函數。 這可能不會讓您感到驚訝,因為您正在閱讀一本深度學習書,因此您可能猜測深度學習必須在某個地方出現。 就是那個地方
# 深度 Q 網絡
**深層 Q 網絡**(**DQN**)是近似`Q`函數的神經網絡。 他們將狀態映射到動作,并學會估計每個動作的`Q`值,如下圖所示:

我們可以使用深度神經網絡作為函數來逼近該矩陣,而不是嘗試存儲一個無限大的矩陣,而是將獎勵從連續狀態空間映射到動作。 這樣,我們可以將神經網絡用作智能體的大腦。 但這一切都導致我們提出一個非常有趣的問題。 我們如何訓練這個網絡?
# 在線學習
當我們的智能體通過采取行動從一個狀態過渡到另一個狀態時,它會得到獎勵。 智能體可以通過使用每個狀態,動作和獎勵作為訓練輸入來在線學習。 在執行每個操作后,該智能體將更新其神經網絡權重,并希望在此過程中變得更聰明。 這是在線學習的基本思想。 智能體就像您和我一樣,不斷學習。
這種樸素的在線學習的缺點有些明顯,有兩個方面:
* 經歷之后,我們就會放棄經驗。
* 我們所經歷的經驗彼此高度相關,我們將過度適應最新的經驗。 有趣的是,這也是人類遭受的苦難,稱為可用性偏差。
我們可以通過使用內存和經驗重放來解決這些問題。
# 記憶和經驗重放
當我們引入有限存儲空間的概念時,可以找到針對這兩個問題的巧妙解決方案,該存儲空間用于存儲智能體具有的一組經驗。 在每個狀態下,我們都可以借此機會記住狀態,行動和獎勵。 然后,智能體可以通過從內存中采樣一個隨機小批量并使用該小批量更新 DQN 權重,定期重放這些經驗。
這種重放機制使智能體能夠以一般的方式從更長遠的經驗中學習,因為它是從內存中的那些經驗中隨機采樣的,而不是僅使用最近的經驗來更新整個網絡。
# 利用與探索
通常,我們希望智能體遵循*貪婪*策略,這意味著我們希望智能體采取具有最大`Q`值的操作。 在學習網絡的同時,我們不希望它總是貪婪地表現。 如果這樣做,它將永遠不會探索新的選擇,也不會學習新的東西。 因此,我們需要我們的智能體偶爾執行不符合規定的策略。
平衡這種探索的最佳方法是一個持續不斷的研究主題,并且已經使用了很長時間。 但是,我們將使用的方法非常簡單。 智能體每次執行操作時,我們都會生成一個隨機數。 如果該數字等于或小于某個閾值`ε`,則智能體將采取隨機措施。 這稱為 **ε 貪婪策略**。
智能體第一次啟動時,對世界了解不多,應該探索更多。 隨著智能體變得越來越聰明,它可能應該減少探索并更多地使用其對環境的了解。 為此,我們只需要在訓練時逐漸降低`ε`。 在我們的示例中,我們將每轉降低`ε`的衰減率,以使它隨每個動作線性減小。
綜上所述,我們有一個**線性退火 ε - 貪心 Q 策略**,說起來既簡單又有趣。
# DeepMind
至少沒有提到 Mnih 等人的論文[《和深度強化學習一起玩 Atari》](https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf),就不會完成關于強化學習的討論。 然后是 DeepMind,現在是 Google。 在這篇具有里程碑意義的論文中,作者使用了卷積神經網絡來訓練深度 Q 網絡來玩 Atari 2600 游戲。 他們從 Atari 2600 游戲中獲取原始像素輸出,將其縮小一點,將其轉換為灰度,然后將其用作網絡的狀態空間輸入。 為了使計算機了解屏幕上對象的速度和方向,他們使用了四個圖像緩沖區作為深度 Q 網絡的輸入。
作者能夠創建一個智能體,該智能體能夠使用完全相同的神經網絡架構玩 7 個 Atari 2600 游戲,并且在其中三個游戲上,該智能體要比人類更好。 后來又擴大到 49 場比賽,其中大多數比賽都比人類出色。 本文是邁向通用 AI 的非常重要的一步,它實際上是目前在強化學習中開展的許多研究的基礎。
# Keras 強化學習框架
在這一點上,我們應該有足夠的背景知識來開始建立深層的 Q 網絡,但是仍然需要克服很大的障礙。
實現利用深度強化學習的智能體可能是一個很大的挑戰,但是最初由 Matthias Plappert 編寫的 Keras-RL 庫使其變得更加容易。 我將使用他的庫來為本章介紹的智能體提供支持。
當然,如果沒有環境,我們的經紀人將不會有太多的樂趣。 我將使用 OpenAI 體育館,該體育館提供許多環境,包括狀態和獎勵函數,我們可以輕松地使用它們來構建供智能體探索的世界。
# 安裝 Keras-RL
Keras-RL 可以通過 PIP 安裝。 但是,我建議從項目 GitHub 存儲庫中安裝它,因為代碼可能會更新一些。 為此,只需克隆存儲庫并按以下方式運行`python setup.py install`:
```py
git clone https://github.com/matthiasplappert/keras-rl.git
cd keras-rl
python setup.py install
```
# 安裝 OpenAI Gym
OpenAI 體育場可作為點子安裝。 我將使用他們的`Box2D`和`atari`環境中的示例。 您可以使用以下代碼安裝它們:
```py
pip install gym
pip install gym[atari]
pip install gym[Box2D]
```
# 使用 OpenAI Gym
使用 OpenAI 體育場確實使深度強化學習變得容易。 Keras-RL 將完成大部分艱苦的工作,但是我認為值得單獨走遍體育館,這樣您才能了解智能體如何與環境互動。
環境是可以實例化的對象。 例如,要創建`CartPole-v0`環境,我們只需要導入體育場并創建環境,如以下代碼所示:
```py
import gym
env = gym.make("CartPole-v0")
```
現在,如果我們的智能體想要在那種環境中行動,它只需要發送一個`action`并返回一個狀態和一個`reward`,如下所示:
```py
next_state, reward, done, info = env.step(action)
```
該智能體可以通過使用循環與環境進行交互來播放整個劇集。 此循環的每次迭代都對應劇集中的單個步驟。 當智能體從環境接收到“完成”信號時,劇集結束。
# 在 Keras 中建立強化學習智能體
好消息,我們終于可以開始編碼了。 在本部分中,我將演示兩種名為 **CartPole** 和 **Lunar Lander** 的 Keras-RL 智能體。 我選擇這些示例是因為它們不會消耗您的 GPU 和云預算來運行。 它們可以很容易地擴展到 Atari 問題,我在本書的 Git 存儲庫中也包括了其中之一。 您可以照常在`Chapter12`文件夾中找到所有這些代碼。 讓我們快速討論一下這兩種環境:
* **CartPole**:CartPole 環境由平衡在推車上的桿組成。 智能體必須學習如何在立柱下方的推車移動時垂直平衡立柱。 給智能體指定了推車的位置,推車的速度,桿的角度和桿的旋轉速度作為輸入。 智能體可以在推車的任一側施加力。 如果電線桿與垂直線的夾角下降超過 15 度,我們的經紀人就此告吹。
* **Lunar Lander**:Lunar Lander 的環境更具挑戰性。 特工必須將月球著陸器降落在著陸墊上。 月亮的表面會發生變化,著陸器的方位也會在每個劇集發生變化。 該智能體將獲得一個八維數組,用于描述每個步驟中的世界狀態,并且可以在該步驟中執行四個操作之一。 智能體可以選擇不執行任何操作,啟動其主引擎,啟動其左向引擎或啟動其右向引擎。
# CartPole
CartPole 智能體將使用一個相當適度的神經網絡,即使沒有 GPU,您也應該能夠相當迅速地進行訓練。 我們將一如既往地從模型架構開始。 然后,我們將定義網絡的內存,探索策略,最后訓練智能體。
# CartPole 神經網絡架構
三個具有 16 個神經元的隱藏層實際上可能足以解決這個簡單的問題。 這個模型非常類似于我們在本書開始時使用的一些基本模型。 我們將使用以下代碼來定義模型:
```py
def build_model(state_size, num_actions):
input = Input(shape=(1,state_size))
x = Flatten()(input)
x = Dense(16, activation='relu')(x)
x = Dense(16, activation='relu')(x)
x = Dense(16, activation='relu')(x)
output = Dense(num_actions, activation='linear')(x)
model = Model(inputs=input, outputs=output)
print(model.summary())
return model
```
輸入將是一個`1 x 狀態空間`向量,每個可能的動作都有一個輸出神經元,它將預測每個步驟該動作的`Q`值。 通過獲取輸出的`argmax`,我們可以選擇`Q`值最高的動作,但是我們不必自己做,因為 Keras-RL 會為我們做。
# 記憶
Keras-RL 為我們提供了一個名為`rl.memory.SequentialMemory`的類,該類提供了快速有效的數據結構,我們可以將智能體的經驗存儲在以下位置:
```py
memory = SequentialMemory(limit=50000, window_length=1)
```
我們需要為此存儲對象指定一個最大大小,它是一個超參數。 隨著新的經驗添加到該內存中并變得完整,舊的經驗會被遺忘。
# 策略
Keras-RL 提供了一個稱為`rl.policy.EpsGreedyQPolicy`的 ε-貪婪 Q 策略,我們可以用來平衡利用與探索。 當智能體程序向世界前進時,我們可以使用`rl.policy.LinearAnnealedPolicy`來衰減`ε`,如以下代碼所示:
```py
policy = LinearAnnealedPolicy(EpsGreedyQPolicy(), attr='eps', value_max=1., value_min=.1, value_test=.05, nb_steps=10000)
```
在這里我們要說的是,我們要從`ε`的值 1 開始,并且不小于 0.1,同時測試我們的隨機數是否小于 0.05。 我們將步數設置為 .1 到 10,000 之間,Keras-RL 為我們處理衰減數學。
# 智能體
定義了模型,內存和策略后,我們現在就可以創建一個深度 Q 網絡智能體,并將這些對象發送給該智能體。 Keras RL 提供了一個稱為`rl.agents.dqn.DQNAgent`的智能體類,我們可以為此使用它,如以下代碼所示:
```py
dqn = DQNAgent(model=model, nb_actions=num_actions, memory=memory, nb_steps_warmup=10,
target_model_update=1e-2, policy=policy)
dqn.compile(Adam(lr=1e-3), metrics=['mae'])
```
此時,其中兩個參數`target_model_update`和`nb_steps_warmup`可能還不熟悉:
* `nb_steps_warmup`:確定我們開始進行經驗重放之前需要等待的時間,如果您還記得的話,這是我們實際上開始訓練網絡的時間。 這使我們積累了足夠的經驗來構建適當的小批量生產。 如果您為此參數選擇的值小于批量大小,則 Keras RL 將抽樣替換。
* `target_model_update`:`Q`函數是遞歸的,當智能體更新它的網絡以獲取` Q(s, a)`時,更新也影響其對`Q(s', a)`所??做的預測。 這會導致網絡非常不穩定。 大多數深度 Q 網絡實現解決此限制的方法是使用目標網絡,該目標網絡是未經訓練的深度 Q 網絡的副本,而經常被新副本替換。 `target_model_update`參數控制這種情況發生的頻率。
# 訓練
Keras RL 提供了多個類似 Keras 的回調,可以方便地進行模型檢查指向和記錄。 我將在下面使用這兩個回調。 如果您想查看 Keras-RL 提供的更多回調,[可以在以下位置找到它們](https://github.com/matthiasplappert/keras-rl/blob/master/rl/callbacks.py)。 您還可以找到可用于創建自己的 Keras-RL 回調的回調類。
我們將使用以下代碼來訓練我們的模型:
```py
def build_callbacks(env_name):
checkpoint_weights_filename = 'dqn_' + env_name + '_weights_{step}.h5f'
log_filename = 'dqn_{}_log.json'.format(env_name)
callbacks = [ModelIntervalCheckpoint(checkpoint_weights_filename, interval=5000)]
callbacks += [FileLogger(log_filename, interval=100)]
return callbacks
callbacks = build_callbacks(ENV_NAME)
dqn.fit(env, nb_steps=50000,
visualize=False,
verbose=2,
callbacks=callbacks)
```
一旦構建了智能體的回調,我們就可以使用`.fit()`方法來擬合`DQNAgent`,就像使用 Keras 模型一樣。 在此示例中,請注意`visualize`參數。 如果將`visualize`設置為`True`,我們將能夠觀察智能體與環境的交互。 但是,這大大減慢了訓練的速度。
# 結果
在前 250 個劇集之后,我們將看到劇集的總獎勵接近 200,劇集步驟的總獎勵也接近 200。這意味著智能體已學會平衡購物車上的桿位,直到環境結束最多 200 個步驟 。
觀看我們的成功當然很有趣,因此我們可以使用`DQNAgent` `.test()`方法評估某些劇集。 以下代碼用于定義此方法:
```py
dqn.test(env, nb_episodes=5, visualize=True)
```
在這里,我們設置了`visualize=True`,以便我們可以看到我們的智能體平衡桿位,如下圖所示:

我們走了,那是一根平衡桿! 好吧,我知道,我承認平衡手推車上的電線桿并不是那么酷,所以讓我們再做一個輕量級的例子。 在此示例中,我們將把月球著陸器降落在月球上,希望它將給您留下深刻的印象。
# Lunar Lander
感謝 Keras-RL,我們用于 Lunar Lander 的智能體幾乎與 CartPole 相同,除了實際的模型架構和一些超參數更改外。 Lunar Lander 的環境有八個輸入而不是四個輸入,我們的智能體現在可以選擇四個操作而不是兩個。
如果您受到這些示例的啟發,并決定嘗試構建 Keras-RL 網絡,請記住,超參數選擇非常非常重要。 對于 Lunar Lander 智能體,對模型架構的最小更改導致我的智能體無法學習環境解決方案。 使網絡正確運行是一項艱巨的工作。
# Lunar Lander 網絡架構
我的 Lunar Lander 智能體程序的架構僅比 CartPole 的架構稍微復雜一點,對于相同的三個隱藏層僅引入了幾個神經元。 我們將使用以下代碼來定義模型:
```py
def build_model(state_size, num_actions):
input = Input(shape=(1, state_size))
x = Flatten()(input)
x = Dense(64, activation='relu')(x)
x = Dense(32, activation='relu')(x)
x = Dense(16, activation='relu')(x)
output = Dense(num_actions, activation='linear')(x)
model = Model(inputs=input, outputs=output)
print(model.summary())
return model
```
在此問題的情況下,較小的架構會導致智能體學習控制和懸停著陸器,但實際上并未著陸。 當然,由于我們要對每個劇集的每個步驟進行小批量更新,因此我們需要仔細權衡復雜性與運行時和計算需求之間的關系。
# 記憶和策略
CartPole 的內存和策略可以重復使用。 我相信,通過進一步調整**線性退火策略**中的步驟,可能會提高智能體訓練的速度,因為該智能體需要采取更多的步驟來進行訓練。 但是,為 CartPole 選擇的值似乎可以很好地工作,因此這是留給讀者的練習。
# 智能體
從以下代碼中可以看出,Lunar Lander `DQNAgent`再次相同,只是學習率小得多。
```py
dqn = DQNAgent(model=model, nb_actions=num_actions, memory=memory, nb_steps_warmup=10, target_model_update=1e-2, policy=policy)
dqn.compile(Adam(lr=0.00025), metrics=['mae'])
```
# 訓練
在訓練該特工時,您會注意到它學會做的第一件事是將著陸器懸停,并避免著陸。 當著陸器最終著陸時,它會收到非常高的獎勵,成功著陸時為 +100,墜毀時為 -100。 這種 -100 的獎勵是如此之強,以至于智能體一開始寧愿因懸停而受到小額罰款。 我們的探員要花很多時間才能得出這樣的提示:良好的著陸總比沒有良好著陸好,因為墜機著陸非常糟糕。
可以塑造獎勵信號來幫助座席更快地學習,但這超出了本書的范圍。 有關更多信息,請查看獎勵塑造。
由于這種對墜機著陸的極端負面反饋,網絡需要花費相當長的一段時間才能學會著陸。 在這里,我們正在運行五十萬個訓練步驟,以傳達我們的信息。 我們將使用以下代碼來訓練智能體:
```py
callbacks = build_callbacks(ENV_NAME)
dqn.fit(env, nb_steps=1000000,
visualize=False,
verbose=2,
callbacks=callbacks)
```
您可以通過調整參數`gamma`(默認值為 0.99)來進一步改進此示例。 如果您從`Q`函數中調用,此參數會減少或增加`Q`函數中將來獎勵的影響。
# 結果
我在 Git 一章中包含了 Lunar Lander 的權重,并創建了一個腳本,該腳本在啟用可視化的情況下運行這些權重`dqn_lunar_lander_test.py`。 它加載經過訓練的模型權重并運行 10 集。 在大多數情況下,特工能夠以驚人的技能和準確率將月球著陸器降落在其著陸板上,如以下屏幕截圖所示:

希望這個例子可以說明,盡管深層 Q 網絡并不是*火箭科學*,但仍可用于控制火箭。
# 總結
斯坦福大學只教授強化學習的整個課程。 可能只寫了一本關于強化學習的書,實際上已經做了很多次。 我希望本章能夠向您展示足夠的知識,讓您開始解決強化學習問題。
當我解決“月球著陸器”問題時,很容易讓我的頭腦從玩具問題到利用深層 Q 網絡驅動的特工進行實際太空探索而徘徊。 我希望本章為您做同樣的事情。
在下一章中,我將向您展示深度神經網絡的最后一種用法,我們將研究可以生成新圖像,數據點甚至音樂的網絡,稱為**生成對抗網絡**。
- TensorFlow 1.x 深度學習秘籍
- 零、前言
- 一、TensorFlow 簡介
- 二、回歸
- 三、神經網絡:感知器
- 四、卷積神經網絡
- 五、高級卷積神經網絡
- 六、循環神經網絡
- 七、無監督學習
- 八、自編碼器
- 九、強化學習
- 十、移動計算
- 十一、生成模型和 CapsNet
- 十二、分布式 TensorFlow 和云深度學習
- 十三、AutoML 和學習如何學習(元學習)
- 十四、TensorFlow 處理單元
- 使用 TensorFlow 構建機器學習項目中文版
- 一、探索和轉換數據
- 二、聚類
- 三、線性回歸
- 四、邏輯回歸
- 五、簡單的前饋神經網絡
- 六、卷積神經網絡
- 七、循環神經網絡和 LSTM
- 八、深度神經網絡
- 九、大規模運行模型 -- GPU 和服務
- 十、庫安裝和其他提示
- TensorFlow 深度學習中文第二版
- 一、人工神經網絡
- 二、TensorFlow v1.6 的新功能是什么?
- 三、實現前饋神經網絡
- 四、CNN 實戰
- 五、使用 TensorFlow 實現自編碼器
- 六、RNN 和梯度消失或爆炸問題
- 七、TensorFlow GPU 配置
- 八、TFLearn
- 九、使用協同過濾的電影推薦
- 十、OpenAI Gym
- TensorFlow 深度學習實戰指南中文版
- 一、入門
- 二、深度神經網絡
- 三、卷積神經網絡
- 四、循環神經網絡介紹
- 五、總結
- 精通 TensorFlow 1.x
- 一、TensorFlow 101
- 二、TensorFlow 的高級庫
- 三、Keras 101
- 四、TensorFlow 中的經典機器學習
- 五、TensorFlow 和 Keras 中的神經網絡和 MLP
- 六、TensorFlow 和 Keras 中的 RNN
- 七、TensorFlow 和 Keras 中的用于時間序列數據的 RNN
- 八、TensorFlow 和 Keras 中的用于文本數據的 RNN
- 九、TensorFlow 和 Keras 中的 CNN
- 十、TensorFlow 和 Keras 中的自編碼器
- 十一、TF 服務:生產中的 TensorFlow 模型
- 十二、遷移學習和預訓練模型
- 十三、深度強化學習
- 十四、生成對抗網絡
- 十五、TensorFlow 集群的分布式模型
- 十六、移動和嵌入式平臺上的 TensorFlow 模型
- 十七、R 中的 TensorFlow 和 Keras
- 十八、調試 TensorFlow 模型
- 十九、張量處理單元
- TensorFlow 機器學習秘籍中文第二版
- 一、TensorFlow 入門
- 二、TensorFlow 的方式
- 三、線性回歸
- 四、支持向量機
- 五、最近鄰方法
- 六、神經網絡
- 七、自然語言處理
- 八、卷積神經網絡
- 九、循環神經網絡
- 十、將 TensorFlow 投入生產
- 十一、更多 TensorFlow
- 與 TensorFlow 的初次接觸
- 前言
- 1.?TensorFlow 基礎知識
- 2. TensorFlow 中的線性回歸
- 3. TensorFlow 中的聚類
- 4. TensorFlow 中的單層神經網絡
- 5. TensorFlow 中的多層神經網絡
- 6. 并行
- 后記
- TensorFlow 學習指南
- 一、基礎
- 二、線性模型
- 三、學習
- 四、分布式
- TensorFlow Rager 教程
- 一、如何使用 TensorFlow Eager 構建簡單的神經網絡
- 二、在 Eager 模式中使用指標
- 三、如何保存和恢復訓練模型
- 四、文本序列到 TFRecords
- 五、如何將原始圖片數據轉換為 TFRecords
- 六、如何使用 TensorFlow Eager 從 TFRecords 批量讀取數據
- 七、使用 TensorFlow Eager 構建用于情感識別的卷積神經網絡(CNN)
- 八、用于 TensorFlow Eager 序列分類的動態循壞神經網絡
- 九、用于 TensorFlow Eager 時間序列回歸的遞歸神經網絡
- TensorFlow 高效編程
- 圖嵌入綜述:問題,技術與應用
- 一、引言
- 三、圖嵌入的問題設定
- 四、圖嵌入技術
- 基于邊重構的優化問題
- 應用
- 基于深度學習的推薦系統:綜述和新視角
- 引言
- 基于深度學習的推薦:最先進的技術
- 基于卷積神經網絡的推薦
- 關于卷積神經網絡我們理解了什么
- 第1章概論
- 第2章多層網絡
- 2.1.4生成對抗網絡
- 2.2.1最近ConvNets演變中的關鍵架構
- 2.2.2走向ConvNet不變性
- 2.3時空卷積網絡
- 第3章了解ConvNets構建塊
- 3.2整改
- 3.3規范化
- 3.4匯集
- 第四章現狀
- 4.2打開問題
- 參考
- 機器學習超級復習筆記
- Python 遷移學習實用指南
- 零、前言
- 一、機器學習基礎
- 二、深度學習基礎
- 三、了解深度學習架構
- 四、遷移學習基礎
- 五、釋放遷移學習的力量
- 六、圖像識別與分類
- 七、文本文件分類
- 八、音頻事件識別與分類
- 九、DeepDream
- 十、自動圖像字幕生成器
- 十一、圖像著色
- 面向計算機視覺的深度學習
- 零、前言
- 一、入門
- 二、圖像分類
- 三、圖像檢索
- 四、對象檢測
- 五、語義分割
- 六、相似性學習
- 七、圖像字幕
- 八、生成模型
- 九、視頻分類
- 十、部署
- 深度學習快速參考
- 零、前言
- 一、深度學習的基礎
- 二、使用深度學習解決回歸問題
- 三、使用 TensorBoard 監控網絡訓練
- 四、使用深度學習解決二分類問題
- 五、使用 Keras 解決多分類問題
- 六、超參數優化
- 七、從頭開始訓練 CNN
- 八、將預訓練的 CNN 用于遷移學習
- 九、從頭開始訓練 RNN
- 十、使用詞嵌入從頭開始訓練 LSTM
- 十一、訓練 Seq2Seq 模型
- 十二、深度強化學習
- 十三、生成對抗網絡
- TensorFlow 2.0 快速入門指南
- 零、前言
- 第 1 部分:TensorFlow 2.00 Alpha 簡介
- 一、TensorFlow 2 簡介
- 二、Keras:TensorFlow 2 的高級 API
- 三、TensorFlow 2 和 ANN 技術
- 第 2 部分:TensorFlow 2.00 Alpha 中的監督和無監督學習
- 四、TensorFlow 2 和監督機器學習
- 五、TensorFlow 2 和無監督學習
- 第 3 部分:TensorFlow 2.00 Alpha 的神經網絡應用
- 六、使用 TensorFlow 2 識別圖像
- 七、TensorFlow 2 和神經風格遷移
- 八、TensorFlow 2 和循環神經網絡
- 九、TensorFlow 估計器和 TensorFlow HUB
- 十、從 tf1.12 轉換為 tf2
- TensorFlow 入門
- 零、前言
- 一、TensorFlow 基本概念
- 二、TensorFlow 數學運算
- 三、機器學習入門
- 四、神經網絡簡介
- 五、深度學習
- 六、TensorFlow GPU 編程和服務
- TensorFlow 卷積神經網絡實用指南
- 零、前言
- 一、TensorFlow 的設置和介紹
- 二、深度學習和卷積神經網絡
- 三、TensorFlow 中的圖像分類
- 四、目標檢測與分割
- 五、VGG,Inception,ResNet 和 MobileNets
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻