前往
大廳
主題 達人專欄

[星爆AI #1] 了解繪圖AI原理,圖像生成對抗網路 GAN 基礎篇

%%鼠 拒收病婿 | 2022-12-03 22:02:23 | 巴幣 5364 | 人氣 2390

前言:
除了之前學理論外,這次是我第一次實做GAN,感謝這個頻道帶我們實作論文中的程式:Aladdin Persson - YouTube
我這篇做些額外整理與補充。

目前星爆AI智商 (因為訓練資料太少,下一步大概會做自動星爆資料處理):

程式一樣在個人網站閱讀比較方便喔~

生成對抗網路 (Generative Adversarial Network)

就是現在最夯的繪圖AI基本網路,他是由Generator和Discriminator組成,訓練階段也分成兩種:
  1. 固定Generator參數並持續產生圖片,參雜真實圖片給Discriminator看,Discriminator要去分辨誰是生產的,誰是真實的,以此訓練Discriminator。
  2. 固定Discriminator的參數,Generator要學著產生會讓Discriminator誤判的圖片(真假難辨的地步),也就是目標讓Discriminator誤判最大化。

製作Module

以PyTorch來講,pytorch主要分成torch.nn , torch.optim , Dataset , and DataLoader四個部分。Module歸類在Container下,是所有NN的基本類別,NN內的內容皆須繼承自Module。且必須初始化父類別與前向傳播(forward)。
[官方範例]

[範例] 基本NN:將輸入的數值+1


產生文字圖片

以最入門的MNIST資料庫為例,使用GAN產生文字。
 
定義Disc和Gen:

*Gen通常會比Disc多一個雜訊參數。


Linear層 (全連接層)

最基本的概念如同我們國小學的:y=ax+b , a是權重,b是位移。
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
[範例]

需要注意的是他輸出的shape:
 

Weight和Bias

預設值,會在每次反向傳播時更新。


也可以自己設定初始值[1]:

LeakyReLU

ReLU是將所有的負值都設為零,相反,Leaky ReLU是給所有負值賦予一個非零斜率。[2]
LeakyReLU — PyTorch 1.13 documentation
[範例]

Sigmoid

有點老的激活函數,後期之後就比較少人用(?),主要是他的曲線有點曖昧(且計算量比ReLu大)[4]。
[範例]

Loss函數

Loss函數[6]定義了誤差距離,最簡單的L1是取直線距離,L2取直線平方距離....到一些進階的BCE取Log距離等等。 神經網路追求的就是誤差(Loss)越小越好。
圖源
 
[範例]

優化器

優化器幫助我們去逼近目標值,torch.optim有包含多種梯度下降演算法供使用。

目前的趨勢是會搭配動能(momentum)來做梯度下降,就像下坡一樣,若動能足夠的話就能幫助我們脫離Local Minima。
 

DataLoader

定義完處理模組後,就可以載入資料開始訓練。
  • batch_size : 一次幾張。
  • shuffle: 是否洗牌 (混著抽)。
 
[範例]下載MNIST資料集並建立Loader物件。


反向傳播(Backpropagation)

當跑完Batch後得出Loss值,便可根據Loss值對神經元的權重做調整。
以前我只知道大概,現在實做讓我有個機會更進階的思考實際是怎麼做到的。  別忘記神經網路就是將input經過一系列的函數處理,如上圖,如果將處理的過程以公式攤開來看,會是一個包含大量變數的式子,我們可以依Loss去對每個變數做微調,可以得到各變數導數對於輸出結果差的比例[7,8]。

[範例] 最基本的訓練週期:

Loss的反向傳播為何能修改model的參數?

不知道你有沒有發現這個問題,當跑完上面的code時,NN的參數就會被更新,optimizer.step是怎麼知道要更新誰的?

爬了幾個討論串[9]後得知,torch的tensor類別會記錄他來自哪裡,且帶grad參數(如果 requires_grad=True),autograd系統就會自動記錄一參數的變化,並在反向傳播時計算梯度。 ( Backward propagation is kicked off when we call .backward() on the error tensor. Autograd then calculates and stores the gradients for each model parameter in the parameter’s .grad attribute.[10])

做一次backward可以理解成對所有參數做一階偏微分,再做一次就是二階偏微分。
 

[實做]

定義參數

在上面我們宣告了Disc和Gen,這裡將他們實例化。

跑訓練




跑25個Epoch:
 
 

參考文獻或建議閱讀:
  1. python - How can I fix the weights of 'torch.nn.Linear'? - Stack Overflow
  2. 啟動函數ReLU、Leaky ReLU、PReLU和RReLU_qq_23304241的博客-CSDN博客_leakyrelu
  3. Day 16 Activation function之群雄亂舞 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (ithome.com.tw)
  4. ReLu vs Sigmoid
  5. PyTorch学习之6种优化方法介绍 - 知乎 (zhihu.com)
  6. PyTorch Loss Functions: The Ultimate Guide - neptune.ai
  7. 圖解反向傳播 Backpropagation. 圖解反向傳播 | by Chenyu Tsai | UXAI | Medium
  8. Backpropagation calculus | Chapter 4, Deep learning - YouTube
  9. Loss.backward() for two different nets - PyTorch Forums
  10. A Gentle Introduction to torch.autograd — PyTorch Tutorials 1.13.0+cu117 documentation
 

送禮物贊助創作者 !
0
留言

創作回應

(ᗜˬᗜ) 雞肋骨
不愧是%%鼠,我完全理解了(什麼都不懂
2022-12-04 02:10:55
%%鼠 拒收病婿
不急不急,未來哪天碰到類似問題就會想起來ㄌ
2022-12-04 18:02:03
御安鴨·摸頭害鴨哭
Sigmoid就是個屁
2022-12-04 03:23:30
%%鼠 拒收病婿
不知道為甚麼滿多架構還是用他[e18]
2022-12-04 18:01:32
蝦米coco
太好了最近在做AI的專案,這篇可以加減看一下,物件辨識應該用的到吧[e18]
2022-12-05 00:48:30
%%鼠 拒收病婿
主要是Loss定義不一樣,但架構可以加減看。話說我正在做星爆物件辯識,之後應該能幫上忙。[e12]
2022-12-05 00:53:05
蝦米coco
我是直接套用大師的YOLOv7套件去做的,目前有遇到一些問題,如果下禮拜弄不出來結果的話,可能再麻煩你幫忙[e23]
2022-12-05 00:57:46
%%鼠 拒收病婿
蝦米謙虛ㄌ[e17] 我剛從YoLov1學起,打了一點程式活後,目前正在慢慢貼標籤[e9]
2022-12-05 01:09:31
蝦米coco
公司的專案有400多張粒子圖片,一張就有30~50顆,感覺一半的時間都會是在標記圖片[e26] [e26] ,太可怕了
2022-12-05 01:19:06
追蹤 創作集

作者相關創作

相關創作

更多創作