PyTorch深度學習實戰(45)——強化學習
- 0. 前言
- 1. 強化學習基礎
- 1.1 基本概念
- 1.2 馬爾科夫決策過程
- 1.3 目標函數
- 1.4 智能體學習過程
- 2. 計算狀態值
- 3. 計算狀態-動作值
- 4. Q 學習
- 4.1 Q 值
- 4.2 Gym環境
- 4.3 構建 Q 表
- 4.4 探索-利用策略
- 小結
- 系列鏈接
0. 前言
強化學習是當前人工智能領域的研究熱點問題,強化學習主要通過考察智能體與環境的相互作用,得到策略模型、優化策略并最大化累積回報的過程。強化學習具有巨大的研究價值和應用潛力,是實現通用人工智能的關鍵技術。本文首先介紹強化學習的基本原理,包括馬爾可夫決策過程、價值函數、探索-利用問題等,然后介紹經典的強化學習算法,最后使用 PyTorch
實現在游戲中模擬強化學習算法。
1. 強化學習基礎
1.1 基本概念
強化學習 (Reinforcement learning
, RL
) 是機器學習中的一個重要領域,其核心思想在于最大化智能體在相應環境中得到的累計獎勵,重點研究智能體應該如何在給定環境狀態下執行動作來最大化累積獎勵,從而學習能夠令智能體完成目標任務的最佳策略。智能體 (agent
) 在每個時刻可以與環境 (environment
) 交互,交互過程如下所示:
每次交互,都可以得到一個具有多維特征的觀察 (observation
),根據觀察可以得到狀態 (state
),智能體根據狀態選擇相應的動作 (action
),環境會對 agent
的不同動作給予不同獎勵 (reward
),從狀態到動作的映射函數稱為策略 (policy
)。通過重復執行此過程,就可以得到令累計獎勵最大化的最佳策略。
例如,在象棋對戰中,計算機是一個已經學習或正在學習如何下棋的智能體,游戲的規則設置構成環境,移動棋子(執行動作)后,棋盤中棋子的位置(狀態)發生了變化,游戲結束時,智能體根據游戲結果獲得獎勵,智能體的目標是最大化獎勵。
在智能體 (agent1
) 與人類進行游戲過程中,它可以進行的游戲是有限的(取決于人類水平),這可能會成為智能體的學習瓶頸。但是,如果 agent1
(正在學習如何游戲的智能體)可以與 agent2
對戰(另一個正在學習的智能體或者一個已經能夠出色進行游戲的棋類軟件),從理論上講,這些智能體就可以無限制的相互博弈,從而最大限度地提高智能體學習玩好游戲的機會。這樣,通過在多次游戲上互相博弈,智能體有可能學習如何很好地解決游戲中的不同場景/狀態。
1.2 馬爾科夫決策過程
智能體從環境初始狀態開始,根據策略模型采樣某一動作,環境在動作的影響下,會從原狀態改變為新狀態,同時給予智能體獎勵。以上過程不斷重復直到達到游戲的終止狀態,這個過程也稱為軌跡 (trajectory
),一個過程稱為一個回合 (episode
)。環境的當前狀態通常取決于多個歷史狀態,計算非常復雜,為了簡化計算流程,我們通常假設當前時間戳上的狀態僅僅受上一狀態的影響,這種性質稱為馬爾科夫性 (Markov Property
),具有馬爾科夫性的序列稱為馬爾科夫過程 (Markov Process
)。
如果我們將執行的動作也考慮進狀態轉移概率,同樣應用馬爾科夫假設,當前狀態只與上一狀態和上一狀態上執行的動作相關,則我們把狀態和動作的有序序列叫做馬爾科夫決策過程 (Markov Decision Process
, MDP
)。當智能體只能觀察到環境的部分狀態時,稱為部分可觀察馬爾可夫決策過程 (Partially Observable Markov Decision Process
, POMDP
)
1.3 目標函數
智能體每次在與環境進行交互時,都會得到一個獎勵,一次交互軌跡的累計獎勵稱為總回報 (return
),但在某些環境中的獎勵是十分稀疏的,例如在棋牌類游戲中,前面的動作獎勵均為 0
,只有游戲結束時才有表示輸贏的獎勵。為了權衡近期獎勵與長期獎勵,引入折扣率來令獎勵隨時間衰減。
由于環境狀態轉移和策略具有一定的隨機性,即使使用同樣的策略模型作用域同一環境,也可能產生截然不同的軌跡序列,因此強化學習的目標是最大化期望回報。
1.4 智能體學習過程
通常,智能體的學習過程如下:
- 最初,智能體在給定狀態下采取隨機動作
- 智能體將它在游戲中的各種狀態下所采取的動作存儲在內存中
- 然后,智能體將各種狀態下的動作結果與獎勵相關聯
- 在進行多次游戲之后,智能體可以通過重播其經驗將一個狀態中的動作與潛在獎勵相關聯
2. 計算狀態值
接下來,量化在給定狀態下采取動作所對應的值問題,為了理解如何量化一個狀態的值,定義環境和目標如下:
環境是一個兩行三列的網格,智能體從 start
單元格開始,如果智能體到達右下角的網格單元格,則表示目標實現,智能體得到 +1
的分數獎勵;如果智能體到達其他單元格,將無法得到獎勵,或者說獎勵為 0
。智能體可以通過向右、向左、底部或向上移動來執行動作,具體取決于動作的可行性,例如,智能體在起始網格單元格中只能向右或向下移動。
利用這些信息,我們可以計算一個單元格的值(即智能體在所處的狀態)。假設從一個單元格移動到另一個單元格需要耗費一定能量,我們使用折扣因子 γ γ γ 表示負責從一個單元格移動到另一個單元格所花費的能量。此外,引入 γ γ γ 可以使智能體更快的進行學習。接下來形式化貝爾曼方程,用于計算單元格的值;
v a l u e o f a c t i o n t a k e n i n a s t a t e = r e w a r d o f m o v i n g t o t h e n e x t c e l l + γ × v a l u e o f t h e b e s t p o s s i b l e a c t i o n i n n e x t s t a t e \begin{aligned} value\ of\ action\ taken\ in\ a\ state&=reward\ of\ moving\ to\ the\ next\ cell + \\ &\gamma\times value\ of\ the\ best\ possible\ action\ in\ next\ state \end{aligned} value?of?action?taken?in?a?state?=reward?of?moving?to?the?next?cell+γ×value?of?the?best?possible?action?in?next?state?
根據以上等式,一旦確定了某一狀態下的最佳動作,就可以計算所有單元格的值,設 γ γ γ 值為 0.9 0.9 0.9 ( γ γ γ 通常在 0.9
和 0.99
之間):
V 22 = R 23 + γ × V 23 = 1 + γ × 0 = 1 V 13 = R 23 + γ × V 23 = 1 + γ × 0 = 1 V 21 = R 22 + γ × V 22 = 0 + γ × 1 = 0.9 V 12 = R 13 + γ × V 13 = 1 + γ × 1 = 0.9 V 11 = R 12 + γ × V 12 = 1 + γ × 0.9 = 0.81 V_{22}=R_{23}+\gamma\times V_{23}=1+\gamma\times 0=1 \\ V_{13}=R_{23}+\gamma\times V_{23}=1+\gamma\times 0=1 \\ V_{21}=R_{22}+\gamma\times V_{22}=0+\gamma\times 1=0.9 \\ V_{12}=R_{13}+\gamma\times V_{13}=1+\gamma\times 1= 0.9\\ V_{11}=R_{12}+\gamma\times V_{12}=1+\gamma\times 0.9=0.81 V22?=R23?+γ×V23?=1+γ×0=1V13?=R23?+γ×V23?=1+γ×0=1V21?=R22?+γ×V22?=0+γ×1=0.9V12?=R13?+γ×V13?=1+γ×1=0.9V11?=R12?+γ×V12?=1+γ×0.9=0.81
從以上計算中,我們可以了解如何計算給定單元格(狀態)中的值,當給定該狀態下的最佳動作時。對于本節所用的簡單示例,計算方法如下:
得到這些值后,我們期望智能體能夠遵循值增加的路徑采取動作。了解了如何計算狀態值后,在下一節中,我們將了解如何計算與狀態-動作組合相關的值。
3. 計算狀態-動作值
在上一節中,我們假設能夠預先了解智能體如何獲取最優動作,但這在實際場景中并不現實。在本節中,我們將學習如何確定與狀態-動作組合對應的值。
如下圖所示,單元格中的每個子單元格代表在該單元格中采取動作的值。最初,各種動作的單元格值如下:
在上圖中,如果智能體從 b1
單元格向右移動或從 c2
單元格向下移動,則 b1
/c2
單元格的值為 1,而其他動作的值為 0
;X 表示該動作不可行,因此沒有與之相關聯的值。在四次迭代過程中,給定狀態下采取不同動作更新單元格值如下:
經過多次迭代,以獲取使每個單元格的值最大化的最佳操作。
接下來,我們介紹如何計算第二個表 (Iteration2
) 中的單元格值。以第二個表中第一行、第二列采取向下動作為例,得到的值為 0.3
,當智能體采取向下行動時,它有 1/3
的機會在下一個狀態下采取最優動作。因此,采取向下行動的值如下:
v a l u e o f t a k i n g d o w n w a r d a c t i o n = i m m e d i a t e r e w a r d + γ × ( 1 / 3 × 0 + 1 / 3 × 0 + 1 / 3 × 1 ) = 0 + 0.9 × 1 / 3 = 0.3 \begin{aligned} value\ of\ taking\ downward\ action &=immediate\ reward+ \gamma\times (1/3\times 0+1/3\times 0+1/3\times 1)\\ &=0+0.9\times 1/3\\ &=0.3 \end{aligned} value?of?taking?downward?action?=immediate?reward+γ×(1/3×0+1/3×0+1/3×1)=0+0.9×1/3=0.3?
以類似的方式,我們可以獲得在不同單元格中采取不同可能動作的值。
4. Q 學習
我們已經學習了如何計算所有組合的狀態-動作值。從理論上講,計算了所需要的各種狀態-動作值后,就可以確定在每個狀態下將采取的動作,但在復雜情況下(例如玩視頻游戲),獲取狀態信息并不容易。為了能夠方便的獲取正在進行的游戲的預定義環境,可以使用 OpenAI
的 Gym
環境,使用 Gym 環境可以獲取給定當前狀態下采取動作后的下一狀態信息。雖然,我們一直希望選擇最優路徑,但在某些情況下,智能體可能會陷入局部最小值。
在本節中,我們將首先介紹 Q 值,學習利用 Q-learning
計算給定狀態下動作的值,并介紹如何利用 Gym
環境進行各種游戲。為了避免智能體陷入局部最小值,我們將利用探索-開發技術。
4.1 Q 值
Q 學習 (Q-learning
) 中的 Q 值 (Q-value
) 表示動作的質量,計算方法如下:
v a l u e o f a c t i o n t a k e n i n a s t a t e = r e w a r d o f m o v i n g t o t h e n e x t c e l l + γ × v a l u e o f t h e b e s t p o s s i b l e a c t i o n i n n e x t s t a t e value\ of\ action\ taken\ in\ a\ state=reward\ of\ moving\ to\ the\ next\ cell + \gamma\times value\ of\ the\ best\ possible\ action\ in\ next\ state value?of?action?taken?in?a?state=reward?of?moving?to?the?next?cell+γ×value?of?the?best?possible?action?in?next?state
網絡需要不斷更新給定狀態下的狀態-動作值,直到達到收斂狀態,因此,可以改寫以上公式:
v a l u e o f a c t i o n t a k e n i n a s t a t e = V a l u e o f a c t i o n t a k e n i n a s t a t e + 1 × ( r e w a r d o f m o v i n g t o t h e n e x t c e l l + γ × V a l u e o f t h e b e s t p o s s i b l e a c t i o n i n n e x t s t a t e ? V a l u e o f a c t i o n t a k e n i n a s t a t e ) \begin{aligned} value\ of\ action\ taken\ in\ a\ state &= Value\ of\ action\ taken\ in\ a\ state + \\ & 1\times (reward\ of\ moving\ to\ the\ next\ cell+\\ & \gamma\times Value\ of\ the\ best\ possible\ action\ in\ next\ state-\\ & Value\ of\ action\ taken\ in\ a\ state) \end{aligned} value?of?action?taken?in?a?state?=Value?of?action?taken?in?a?state+1×(reward?of?moving?to?the?next?cell+γ×Value?of?the?best?possible?action?in?next?state?Value?of?action?taken?in?a?state)?
在以上等式中,將 1
替換為學習率,以便可以更穩定的更新在某個狀態下采取的動作的值:
v a l u e o f a c t i o n t a k e n i n a s t a t e = V a l u e o f a c t i o n t a k e n i n a s t a t e + l e a r n i n g r a t e × ( r e w a r d o f m o v i n g t o t h e n e x t c e l l + γ × V a l u e o f t h e b e s t p o s s i b l e a c t i o n i n n e x t s t a t e ? V a l u e o f a c t i o n t a k e n i n a s t a t e ) \begin{aligned} value\ of\ action\ taken\ in\ a\ state &= Value\ of\ action\ taken\ in\ a\ state + \\ & learning\ rate\times (reward\ of\ moving\ to\ the\ next\ cell+\\ & \gamma\times Value\ of\ the\ best\ possible\ action\ in\ next\ state-\\ & Value\ of\ action\ taken\ in\ a\ state) \end{aligned} value?of?action?taken?in?a?state?=Value?of?action?taken?in?a?state+learning?rate×(reward?of?moving?to?the?next?cell+γ×Value?of?the?best?possible?action?in?next?state?Value?of?action?taken?in?a?state)?
根據以上 Q 值的正式定義,在下一節中,我們將介紹 Gym 環境以及如何獲取 Q 表(存儲在各個狀態下采取各種動作的值的信息),從而得出給定狀態下的最優動作。
4.2 Gym環境
在本節中,我們將介紹 Gym
環境,并通過進行 Frozen Lake
游戲了解 Gym
環境及其提供的常用函數。
(1) 導入相關庫:
import numpy as np
import gym
import randomfrom gym import envs
(2) 查看 Gym
環境中包含的游戲:
print(envs.registry.all())
以上代碼將打印以下字典,其中包含 Gym
中的所有游戲:
dict_values([EnvSpec(Copy-v0), EnvSpec(RepeatCopy-v0),..., EnvSpec(MemorizeDigits-v0)])
(3) 根據指定游戲名創建游戲環境:
env = gym.make('FrozenLake-v0', is_slippery=False)
(4) 查看創建的環境:
env.render()
以上代碼輸出結果如下:
在上圖中,智能體從 S
開始,F
表示冰面單元格,而 H
表示陷阱單元格,當智能體進入單元格 H
時,游戲終止且智能體獲得的獎勵為 0
,游戲的目標是讓智能體到達 G
。
(5) 查看游戲中狀態空間的大小:
print(env.observation_space.n)
# 16
以上代碼輸出結果為 16
,表示游戲包含 16
個單元格。
(6) 查看游戲中動作空間的大小:
print(env.action_space.n)
# 4
以上代碼輸出結果為 4
,表示游戲可以采取的四種不同的動作。
(7) 在給定狀態下采樣隨機動作:
print(env.action_space.sample())
sample()
方法根據給定狀態采樣將執行的動作,每個動作都有一個對應的標量值與之關聯。
(8) 將環境重置為原始狀態:
print(env.reset())
(9) 采樣并執行一個隨機動作:
print(env.step(env.action_space.sample()))
# (0, 0.0, False, {'prob': 1.0})
step()
方法根據給定動作進行游戲,并返回下一個狀態、獎勵、表示游戲是否已完成的標志以及其他信息。以上步驟是構建 Q 表的基礎,Q 表指示在每個狀態下要采取的最佳動作。
4.3 構建 Q 表
我們已經學習了如何計算各種狀態-動作對的 Q 值,在本節中,將利用 Gym
環境和與之相關的各種模塊填充 Q 表,在 Q 表中行表示智能體可以處于的狀態,列表示智能體可以采取的動作,Q 表的值表示在給定狀態下采取動作的 Q 值。使用以下策略填充 Q 表的值:
- 用零初始化游戲環境和Q表
- 采樣隨機行動并獲取下一個狀態、獎勵、指示游戲是否已完成的標志以及其他附加信息
- 使用貝爾曼方程更新 Q 值
- 重復步驟
2
和步驟3
,一回合 (episode
) 游戲最多有50
步 (step
) - 在多個回合上重復步驟
2
、3
和4
(1) 初始化 FrozenLake
游戲環境:
import numpy as np
import gym
import random
env = gym.make('FrozenLake-v0', is_slippery=False)
(2) 用零值初始化 Q 表:
action_size=env.action_space.n
state_size=env.observation_space.n
qtable=np.zeros((state_size,action_size))
以上代碼用于根據環境的可能操作和狀態構建 Q 表,Q 表的維度為狀態數乘以動作數。
(3) 隨機進行多個回合,在每一回合結束時重置環境:
episode_rewards = []
for i in range(10000):state=env.reset()
每一回合最多進行 50
步:
total_rewards = 0for step in range(50):
為了避免智能體在兩個狀態之間無限循環(如無限次反復向左向右移動 0
),需要指定智能體可以采取的最大步數,在 FrozenLake
游戲中,我們在每個回合中最多進行 50
步,因為智能體有可能永遠在兩個狀態之間保持振蕩(例如永遠循環執行左右動作)。
采樣一個隨機動作并使用 step
方法執行它:
action=env.action_space.sample()new_state,reward,done,info=env.step(action)
更新對應于狀態和動作的 Q 值:
qtable[state,action]+=0.1*(reward+0.9*np.max(qtable[new_state,:])-qtable[state,action])
在以上代碼中,指定學習率為 0.1
,并且在更新狀態-動作組合的 Q 值時考慮下一個狀態的最大 Q 值 (np.max(qtable[new_state,:])
)。
將 state
值更新為 new_state
,并將獎勵累積到 total_rewards
:
state=new_statetotal_rewards+=reward
將獎勵放入列表 (episode_rewards
) 并打印 Q 表 (qtable
):
episode_rewards.append(total_rewards)
print(qtable)
以上代碼可以獲取給定狀態下各種動作的 Q 值:
[[0.53144032 0.59048919 0.59048927 0.53144032][0.5314403 0. 0.6560992 0.59048924][0.59048911 0.72899917 0.59048896 0.65609909][0.65609902 0. 0.59048895 0.59048889][0.59048916 0.6560991 0. 0.53144029][0. 0. 0. 0. ][0. 0.80999921 0. 0.65609884][0. 0. 0. 0. ][0.65609904 0. 0.72899904 0.59048903][0.65609819 0.80999503 0.80999901 0. ][0.72899598 0.89999938 0. 0.72899835][0. 0. 0. 0. ][0. 0. 0. 0. ][0. 0.80998461 0.89999677 0.72899056][0.8099357 0.89995735 0.99999971 0.80996359][0. 0. 0. 0. ]]
在下一節中,我們將介紹如何利用獲 Q 表。在以上代碼中,我們令智能體采取隨機行動。然而,在現實場景中,智能體可以學習到在給定狀態下采取哪一動作可以最大化獎勵,智能體就不需要再采取隨機行動了,稱為探索-利用策略。
4.4 探索-利用策略
在上一節中,我們探討了在給定空間中可以采取的可能動作。在本節中,我們將學習探索-利用的概念:
- 探索策略:在給定狀態下學習需要采取什么動作
- 利用策略:利用已經學到的知識決定在給定狀態下采取哪個動作
在初始階段,需要進行大量的探索,因為智能體最初不知道采取哪些最優動作。隨著 episode
的進行,智能體隨著時間推移學習到了各種狀態-動作組合的 Q 值時,將使用利用策略采取能夠得到高獎勵的動作。據此,我們修改上一節中構建的 Q 值計算方法,引入探索-利用策略:
episode_rewards = []
epsilon=1
max_epsilon=1
min_epsilon=0.01
decay_rate=0.005
for episode in range(1000):state=env.reset()total_rewards = 0for step in range(50):exp_exp_tradeoff=random.uniform(0,1)## Exploitation:if exp_exp_tradeoff>epsilon:action=np.argmax(qtable[state,:])else:## Explorationaction=env.action_space.sample()new_state,reward,done,info=env.step(action)qtable[state,action]+=0.9*(reward+0.9*np.max(qtable[new_state,:])-qtable[state,action])state=new_statetotal_rewards+=rewardepisode_rewards.append(total_rewards)epsilon=min_epsilon+(max_epsilon-min_epsilon)*np.exp(decay_rate*episode)
print(qtable)
在以上代碼中,指定隨著episode的增加,使用利用策略逐漸多于探索策略。
得到 Q 表后,我們就可以利用它來確定智能體到達目的地所需采取的動作步驟:
env.reset()
for episode in range(1):state=env.reset()step=0done=Falseprint("-----------------------")print("Episode",episode)for step in range(50):env.render()action=np.argmax(qtable[state,:])print(action)new_state,reward,done,info=env.step(action) if done:print("Number of Steps",step+1)breakstate=new_state
env.close()
在以上代碼中,獲取智能體所處的當前狀態,識別在給定狀態-動作組合中能夠得到最大值的動作,使用 step
方法采取動作獲取智能體的新狀態 new_state
并重復以上步驟,直到游戲完成/終止。
代碼輸出結果如下所示:
-----------------------
Episode 0SFFF
FHFH
FFFH
HFFG
1(Down)
SFFF
FHFH
FFFH
HFFG
1(Down)
SFFF
FHFH
FFFH
HFFG
2(Right)
SFFF
FHFH
FFFH
HFFG
2(Right)
SFFF
FHFH
FFFH
HFFG
1(Down)
SFFF
FHFH
FFFH
HFFG
2
Number of Steps 6
需要注意的是,在以上簡單示例中,因為狀態空間是離散的,因此可以構建一個 Q 表;而如果狀態空間是連續的(例如,狀態空間是游戲當前狀態的快照圖像),由于可能的狀態數可能非常多,構建 Q 表將變得非常困難。在這種情況下,通常使用深度 Q 學習來解決這一問題。
小結
強化學習通過智能體與環境的交互學習最佳行為策略,通過最大化累積獎勵來指導智能體的決策,是一種面向試錯和反饋的學習方法,旨在解決復雜的決策問題并實現自主學習能力。強化學習在許多領域都有廣泛的應用,如機器人控制、游戲策略、自動駕駛等。它能夠解決具有不確定性和復雜性的問題,并在動態環境下實現自主學習和決策能力。
系列鏈接
PyTorch深度學習實戰(1)——神經網絡與模型訓練過程詳解
PyTorch深度學習實戰(2)——PyTorch基礎
PyTorch深度學習實戰(3)——使用PyTorch構建神經網絡
PyTorch深度學習實戰(4)——常用激活函數和損失函數詳解
PyTorch深度學習實戰(5)——計算機視覺基礎
PyTorch深度學習實戰(6)——神經網絡性能優化技術
PyTorch深度學習實戰(7)——批大小對神經網絡訓練的影響
PyTorch深度學習實戰(8)——批歸一化
PyTorch深度學習實戰(9)——學習率優化
PyTorch深度學習實戰(10)——過擬合及其解決方法
PyTorch深度學習實戰(11)——卷積神經網絡
PyTorch深度學習實戰(12)——數據增強
PyTorch深度學習實戰(13)——可視化神經網絡中間層輸出
PyTorch深度學習實戰(14)——類激活圖
PyTorch深度學習實戰(15)——遷移學習
PyTorch深度學習實戰(16)——面部關鍵點檢測
PyTorch深度學習實戰(17)——多任務學習
PyTorch深度學習實戰(18)——目標檢測基礎
PyTorch深度學習實戰(19)——從零開始實現R-CNN目標檢測
PyTorch深度學習實戰(20)——從零開始實現Fast R-CNN目標檢測
PyTorch深度學習實戰(21)——從零開始實現Faster R-CNN目標檢測
PyTorch深度學習實戰(22)——從零開始實現YOLO目標檢測
PyTorch深度學習實戰(23)——從零開始實現SSD目標檢測
PyTorch深度學習實戰(24)——使用U-Net架構進行圖像分割
PyTorch深度學習實戰(25)——從零開始實現Mask R-CNN實例分割
PyTorch深度學習實戰(26)——多對象實例分割
PyTorch深度學習實戰(27)——自編碼器(Autoencoder)
PyTorch深度學習實戰(28)——卷積自編碼器(Convolutional Autoencoder)
PyTorch深度學習實戰(29)——變分自編碼器(Variational Autoencoder, VAE)
PyTorch深度學習實戰(30)——對抗攻擊(Adversarial Attack)
PyTorch深度學習實戰(31)——神經風格遷移
PyTorch深度學習實戰(32)——Deepfakes
PyTorch深度學習實戰(33)——生成對抗網絡(Generative Adversarial Network, GAN)
PyTorch深度學習實戰(34)——DCGAN詳解與實現
PyTorch深度學習實戰(35)——條件生成對抗網絡(Conditional Generative Adversarial Network, CGAN)
PyTorch深度學習實戰(36)——Pix2Pix詳解與實現
PyTorch深度學習實戰(37)——CycleGAN詳解與實現
PyTorch深度學習實戰(38)——StyleGAN詳解與實現
PyTorch深度學習實戰(39)——小樣本學習(Few-shot Learning)
PyTorch深度學習實戰(40)——零樣本學習(Zero-Shot Learning)
PyTorch深度學習實戰(41)——循環神經網絡與長短期記憶網絡
PyTorch深度學習實戰(42)——圖像字幕生成
PyTorch深度學習實戰(43)——手寫文本識別
PyTorch深度學習實戰(44)——基于 DETR 實現目標檢測