iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

30天淺談機器學習系列 第 10

(10)建立基本類神經網路程式

參考網站:Keras官方指南

  根據上面的參考網站,可以做出基本的類神經網路。
  首先要先有基本的設定,大致上如下:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

  因為keras目前被包含在tensorflow中,因此要先匯入tensorflow,才能匯入keras。
  再來建立Sequential model,這模組可以讓每一層都僅有一個輸入張量(tensor)以及輸出張量,我前面有提到每一層中並非只有一個神經元,一個隱藏層中可能就很多神經元進行不同筆資料的運算,因此得要整合,限制只能有一個輸入以及輸出,而且張量也能幫助進行線性的運算。網站提供程式如下:

model = keras.Sequential(
    [
        layers.Dense(2, activation="relu", name="layer1"),
        layers.Dense(3, activation="relu", name="layer2"),
        layers.Dense(4, name="layer3"),
    ]
)

  在layer.Dense中,activation是激勵函數,主要用來引入非線性資料。因為在訓練類神經網路的時候,輸入和輸出的部分仍然脫離不了線性關係,必須要能讓訓練過的資料輸出給下一層,因此可以用激勵函數來引入非線性資料。激勵函數有:sigmoid, tanh, Relu⋯⋯等等。
  最後要輸入資料以及建立模組來測試是否成功:

x = tf.ones((3, 3))
y = model(x)

  tensorflow中的ones類別,可以創造所有元素都設置為1的張量,以上面程式為例,(3, 3)的意思就是建立一個3x3的矩陣,且該矩陣中的所有元素皆為1。
  接著用以下的輸出來看看建立的如何:「」

print(model.summary())

  得到如下:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
layer1 (Dense)               (3, 2)                    8         
_________________________________________________________________
layer2 (Dense)               (3, 3)                    9         
_________________________________________________________________
layer3 (Dense)               (3, 4)                    16        
=================================================================
Total params: 33
Trainable params: 33
Non-trainable params: 0
_________________________________________________________________
None

  params為參數,也就是權重的個數。當輸入資料時,不同資料與神經元之間會有權重(之前的類神經網路架構的圖,有個神經元要傳送到下一層的神經元時,會乘上各自的權重),這不同的權重個數加總起來就是params。
  因為設定的dense層為基礎神經網路,因此param計算:(輸入數據維度+1)×神經元個數,可是網站提供的設定是(3, 3)這樣維度看起來有2。
  經過測試之後,我的想法是因為dense層很基礎,因此就算輸入的矩陣有多少,主要還是看最後的數字來決定,這維度是只有多少個神經元(以(3,4)為例子較好理解,也就是這輸入層中每個神經元的資料是[1, 1, 1],然後有4個同樣的神經元),因此layer1的params計算為(3+1)×2=8,接著layer2因為layer1的神經元設定只有2,因此layer2的計算為(2+1)3=9⋯⋯以此類推。
  當我把設定tf.ones更改為(3,4,2)得出結果:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
layer1 (Dense)               (3, 4, 2)                 6         
_________________________________________________________________
layer2 (Dense)               (3, 4, 3)                 9         
_________________________________________________________________
layer3 (Dense)               (3, 4, 4)                 16        
=================================================================
Total params: 31
Trainable params: 31
Non-trainable params: 0
_________________________________________________________________
None

  可以看出param在dense層時,只會受到最後的數字影響,且該數字為這一層中有多少神經元。
  只不過以上是我測試多筆資料後的觀察,因為實在找不到相關的解釋,因此才這麼想。


上一篇
Day9:卷積神經網路(Convolutional Neural Networks,CNN)介紹
下一篇
激勵函數
系列文
30天淺談機器學習13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言