PyTorch深度學習實戰(45)——強化學習

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 智能體學習過程

通常,智能體的學習過程如下:

  1. 最初,智能體在給定狀態下采取隨機動作
  2. 智能體將它在游戲中的各種狀態下所采取的動作存儲在內存中
  3. 然后,智能體將各種狀態下的動作結果與獎勵相關聯
  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.90.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 學習

我們已經學習了如何計算所有組合的狀態-動作值。從理論上講,計算了所需要的各種狀態-動作值后,就可以確定在每個狀態下將采取的動作,但在復雜情況下(例如玩視頻游戲),獲取狀態信息并不容易。為了能夠方便的獲取正在進行的游戲的預定義環境,可以使用 OpenAIGym 環境,使用 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()

以上代碼輸出結果如下:

Frozen Lake
在上圖中,智能體從 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 表的值:

  1. 用零初始化游戲環境和Q表
  2. 采樣隨機行動并獲取下一個狀態、獎勵、指示游戲是否已完成的標志以及其他附加信息
  3. 使用貝爾曼方程更新 Q 值
  4. 重復步驟 2 和步驟 3,一回合 (episode) 游戲最多有 50 步 (step)
  5. 在多個回合上重復步驟 234

(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 實現目標檢測

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44576.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44576.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44576.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

悠律凝聲環開放式耳機體驗:強勁低音、高顏值設計

最近發現了一款潮酷的開放式耳機,不僅顏值抗打,更重要的是能在嘈雜的環境中提供給我一份寧靜的沉浸式音樂體驗,號稱是開放音頻中的重低音之王,它就是悠律凝聲環開放式耳機。 這款耳機無論其外觀設計、音質效果、性價比以及續航能力…

通勤數據:Comma2k19 數據集

A Commute in Data: The comma2k19 Dataset 通勤數據:Comma2k19 數據集 https://arxiv.org/pdf/1812.05752v1 Abstract— comma.ai presents comma2k19, a dataset of over 33 hours of commute in California’s 280 highway. This means 2019 segments, 1 minut…

js實現尋找數組中滿足某個條件的對象,以及找到下標后,在數組中插入某個對象

let ItemIndex fileList.findIndex((item) > { return item.xxx 你要找的屬性值 }); if(ItemIndex > -1){ // 代表找到了這個元素 } else { } 參考百度AI: 在JavaScript中,?可以使用splice()方法在指定位置插入一個或多個對象到數組…

npm、cnpm、pnpm、yarn的區別

npm, cnpm, pnpm, 和 yarn 都是 JavaScript 的包管理工具,用于自動化處理包的安裝、更新、配置和管理。它們之間的主要區別在于它們各自的實現方式、性能優化、以及一些特有的功能。 npm npm (Node Package Manager) 是 Node.js 的默認包管理器,也是最…

「媒體邀約」上海請媒體的費用

傳媒如春雨,潤物細無聲,大家好,我是51媒體網胡老師。 上海無疑是最具活動的城市之一,各種大大小小的論壇、發布會、展覽展會應接不暇,那么在上海做活動想邀請媒體進行宣傳報道,需要多少費用呢:…

Android --- 運行時Fragment如何獲取Activity中的數據,又如何將數據傳遞到Activity中呢?

1.通過 getActivity() 方法獲取 Activity 實例: 在 Fragment 中,可以通過 getActivity() 方法獲取當前 Fragment 所依附的 Activity 實例。然后可以調用 Activity 的公共方法或者直接訪問 Activity 的字段來獲取數據。 // 在 Fragment 中獲取 Activity…

手慢無,速看︱PMO大會內部學習資料

全國PMO專業人士年度盛會 每屆PMO大會,組委會都把所有演講嘉賓的PPT印刷在了會刊里面,供大家會后回顧與深入學習。 第十三屆中國PMO大會-會刊 《2024第十三屆中國PMO大會-會刊》 (內含演講PPT) 會刊:750個頁碼&…

代碼隨想錄-DAY④-鏈表——leetcode 24 | 19 | 142

24 思路 如果 pre 的后面沒有節點或者只有一個節點,則沒有更多的節點需要交換, 否則,通過更新節點的指針關系交換 pre 后面的兩個節點, 最后,返回新的鏈表的頭節點 dummyhead->next。 時間復雜度:O(n) 空間復雜…

buuctf面具下的flag

細節: 這道題可能因為是vmdk的原因 導致在window上 7z無法得到全部的信息 所以最后解壓要在linux系統上 解密網站 Brainfuck/Ook! Obfuscation/Encoding [splitbrain.org] 這道題010打開,可以發現里面隱藏了很多 binwalk解壓 兩個文件 vmdk可以直接 用7z解壓 7z x flag.…

Mysql如何高效ALTER TABL

ALTER TABLE 缺點 MySQL 的ALTER TABLE 操作的性能對大表來說是個大問題。 MySQL MySQL 執行大部分修改表結構操作的方法是用新結構的 創建一個,空表從舊表中查出所有數據插入,新表然后刪除舊。表這樣操作可能需要花費很長,時間 如內果存不…

Flutter TabBar與TabBarView聯動及獲取當前點擊欄目索引

TabBar還有TabBarView都是谷歌flutter官方組件庫——Material組件庫提供的組件,其中TabBar用于導航切換,TabBarView則是配合其切換顯示的對應的視圖,官網參考地址:TabBarView class - material library - Dart API。 實現一體聯動…

輕松搭建RAG:澳鵬RAG開發工具

我們很高興地宣布推出RAG開發工具,這是澳鵬大模型智能開發平臺的一項新功能。此功能可幫助團隊輕松創建高質量的檢索增強生成 (RAG) 模型。 什么是 RAG? 檢索增強生成 (RAG) 通過利用大量外部數據源(例如企業的知識庫)顯著增強了…

文獻閱讀(1)——深度強化學習求解車輛路徑問題的研究綜述

doi: 10.3778/j.issn.1002-8331.2210-0153 深度強化學習求解車輛路徑問題的研究綜述 (ceaj.org) 組合最優化問題( combinatorial optimization problem, COP ) 日常生活中常見的 COP 問題有旅行商問題(traveling sale…

數字化轉型領航者:佑美科技塑造智能健康新生態

在全球數字化轉型的浪潮中,佑美專注于智能健康解決方案的創新,正以其卓越的技術實力和前瞻性的戰略眼光,引領著智能穿戴設備和健身器械行業的未來趨勢。佑美科技不僅深耕數字化轉型,更在多個領域獲得了國家級和省級的權威認可,彰顯了其在智能健康領域的影響力。 智能穿戴設備正…

[數據結構] 基于選擇的排序 選擇排序堆排序

標題:[數據結構] 基于選擇的排序 選擇排序&&堆排序 水墨不寫bug (圖片來源于網絡) 目錄 (一)選擇排序 實現:(默認從小到大排序) 優化后實現方法: (二)堆排序…

【Java】垃圾回收學習筆記(二):分代假說與垃圾回收算法

文章目錄 0. 分代收集理論分代假說分代GC定義 1. 垃圾回收算法1.1 標記清除(Mark-Sweep)算法優點缺點 1.2 標記復制算法優點缺點為什么是8:1:1? 1.3 標記整理算法優點缺點 2. 是否移動?Reference 0. 分代收集理論 分代假說 現在…

Navicat和MySQL的安裝

1、下載 Navicat Navicat 官網:www.navicat.com.cn/ 在產品中可以看到很多的產品,點擊免費試用 Navicat Premium 即可,是一套多連數據庫開發工具,其他的只能連接單一類型數據庫 點擊試用 選擇系統直接下載 二、安裝 Navicat 安…

代碼江湖:Python 中的進程與線程

大家好,我是闊升。今天,咱們來聊聊 Python 中的兩個"老熟人"——進程和線程。這兩個概念可以說是 Python 多任務編程中的"雙子星",既相似又不同,讓不少小伙伴們頭疼不已。不過別擔心,今天我們就來…

element el-table實現表格動態增加/刪除/編輯表格行,帶校驗規則

本篇文章記錄el-table增加一行可編輯的數據列,進行增刪改。 1.增加空白行 直接在頁面mounted時對form里面的table列表增加一行數據,直接使用push() 方法增加一列數據這個時候也可以設置一些默認值。比如案例里面的 產品件數 。 mounted() {this.$nextTi…

latex 使用 thanks 首頁空白 問題

寫IEEE journal的時候遇到的問題……用latex寫了\thanks,編譯的論文第一頁是空的,這是因為\thanks要在\author內部,然后再用\maketitle,即\author{… \thanks{}}。這樣的話詳細信息就會出現在論文首頁的左下角 另外,\…