iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
AI/ ML & Data

深度學習的學習之旅:從理論到實作系列 第 19

[Day19] 打造深度學習的 HELLO WORLD!建構卷積神經網路

  • 分享至 

  • xImage
  •  

前言

昨天已經成功引入資料及了解了激勵函數作用,那我們今天實際來將這些運用進來吧。今天會用到的東西會跟Day15提及的很有相關,所以建議不熟悉的朋友們可以先去看看那天的文章,讓自己更熟悉後再繼續往下喔。

程式碼

  1. 建立Sequential model
model = models.Sequential()
  • 建立一個線性的層堆疊,適合於從頭到尾依次構建模型。
    • 我們可以將資料輸出來看看
    • image
    • 這張圖片顯示了使用 model.summary() 方法來查看模型結構的結果。從圖片中可以看出,模型結構的輸出是空的,而且所有參數數量(Total params, Trainable params, Non-trainable params)都是 0。這是因為在調用 model.summary() 方法之前,還沒有向模型中添加任何層。
  1. 加入
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
  • model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))):

    • 添加一個 2D 卷積層(Conv2D layer)。
    • 32 是卷積核(filters)的數量,表示這層會學習 32 個不同的卷積核。
    • (3, 3) 是卷積核的尺寸,表示每個卷積核的大小為 3x3。
    • activation='relu' 指定了激活函數為 ReLU(Rectified Linear Unit),常用於引入非線性。
    • input_shape=(28, 28, 1) 指定輸入圖像的形狀為 28x28 像素,且有 1 個通道(灰度圖像)。
  • model.add(layers.MaxPooling2D((2, 2))):

    • 添加一個 2D 最大池化層(MaxPooling2D layer)。
    • (2, 2) 指定池化窗口的大小為 2x2,這會在每個 2x2 的區域內取最大值,從而減少空間尺寸(寬度和高度)。
  • model.add(layers.Conv2D(64, (3, 3), activation='relu')):

    • 添加另一個 2D 卷積層,這次有 64 個卷積核,大小仍然是 3x3。
    • 激活函數仍然是 ReLU,但這層沒有指定輸入形狀,因為它自動接受來自前一層的輸出。
  • model.add(layers.MaxPooling2D((2, 2))):

    • 添加另一個 2D 最大池化層,池化窗口的大小仍然是 2x2。
  • model.add(layers.Conv2D(64, (3, 3), activation='relu')):

    • 添加第三個 2D 卷積層,這次同樣有 64 個卷積核,大小為 3x3,激活函數是 ReLU。
  • 我們一樣輸出出來看看image
    可以發現這次裡面已經不再是空的了,而且多了好幾層,在參數的地方也增加了很多不再是0了。

  1. 加入 Flatten 層和全連接層
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
  • model.add(layers.Flatten()):
    • 將多維的卷積層輸出展平為一維,以便於後續全連接層的處理。
    • 例如,輸入是形狀為 (batch_size, 3, 3, 64) 的張量,這層會將其轉換為形狀為 (batch_size, 3364) 的一維張量。
  • model.add(layers.Dense(64, activation='relu')):
    • 添加一個全連接層(Dense layer),包含 64 個神經元。
    • 使用 ReLU 激活函數,引入非線性。
  • model.add(layers.Dense(10, activation='softmax')):
    • 添加另一個全連接層,包含 10 個神經元,對應於 10 個類別(0-9)。
    • 使用 Softmax 激活函數,將輸出轉換為概率分佈。

最後一起輸出看看我們最後的Sequential長怎麼樣吧
image

結語

今天建立了這個模型是一個典型的卷積神經網路(CNN),用於處理手寫數字識別任務。模型包括多個卷積層和最大池化層,之後是展平層和全連接層。這些層的設計旨在逐步提取輸入圖像的特徵,並最終進行分類。那我們明天接著今天的內容繼續往下囉。


上一篇
[Day 18] 認識深度學習的Hello World! MNIST訓練資料
下一篇
[Day 20] 深度學習的Hello World!訓練模型並探討過度擬合
系列文
深度學習的學習之旅:從理論到實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言