iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
AI & Data

「AI之旅:Python、Keras、PyTorch」 - 深度學習與數據入門挑戰系列 第 6

【Day6】Keras 辨別手寫數字-第一個模型的說明~

  • 分享至 

  • xImage
  •  

在我們開始解釋昨天程式以前,我們先補充一點關於資料處裡的內容
會從前面沒有講到的概念開始,在以模型解釋結束

  • 歸一化與標準化
  • 激勵函數
  • 張量
  • 模型詳細說明

解釋模型的行前須知

歸一化與標準化

在後續除了歸一化(Normalization)可能還會聽到標準化(Standardization)、中心化等等,其中歸一化及標準化的目標較為雷同後續也較為常用,主要都是把數據範圍縮小同時又不影響原始數據的分佈,通道常會縮到 [0, 1] 或 [-1, 1],這麼做的用意是在避免模型訓練時遇到收斂上的問題,同時還能提高訓練速度,中心化用的較少這裡不多做解釋,想更詳細了解標準化歸一化可以參考。**

https://www.cupoy.com/collection/0000018008CD5D70000000046375706F795F72656C656173654355/00000181709BCC8F000000056375706F795F72656C656173654349

激勵函數

**激勵函數(Activation Function)**是神經網絡中的一個關鍵元素,它在神經元中引入非線性特性,使神經網絡能夠捕捉和學習複雜的數據模式,若沒有激勵函數則無論有多少層神經網路輸出都是輸入的線性組合,這樣加多少層都變得沒有意義了。

下面我們列出幾個常用的激勵函數與它的特點:

  1. Sigmoid 函數
  • Sigmoid 函數將任何實數輸入轉換為範圍在 0 到 1 之間的輸出。
  • 主要用於二元分類問題,以產生概率分佈。
  1. ReLU 函數(Rectified Linear Unit)
  • ReLU 函數將負數輸入變為零,而正數保持不變。
  • 是現在最常用的激勵函數之一,因為它簡單且通常表現良好。
  1. Tanh 函數(雙曲正切函數)
  • Tanh 函數將任何實數輸入轉換為範圍在 -1 到 1 之間的輸出。
  • 類似於 Sigmoid 函數,但對稱分佈。
  1. Softmax 函數:
  • Softmax 函數用於多類別分類問題,將多個輸入轉換為一個概率分佈。
  • 它將每個輸入映射為一個概率值,使所有輸出的總和為1。

5.Leaky ReLU 函數:

  • Leaky ReLU 函數與標準 ReLU 函數相似,但對負數輸入引入一個小的非零斜率,以避免神經元死亡問題。

6.ELU 函數(Exponential Linear Unit)

  • ELU 函數是另一種具有非線性特性的激勵函數,類似於 Leaky ReLU。
  • 對於某些問題可以提供更好的性能。

激勵函數的選擇取決於具體的任務和架構,適當的激勵函數可以幫助神經網絡學習複雜的數據表示,並提高模型的性能。在設計神經網絡時,通常需要根據問題的特性和模型的需求來選擇適當的激勵函數。

張量(Tensor)

張量(Tensor)是多維數組的數學概念,它在深度學習和機器學習中被廣泛使用。簡單來說,張量是具有多個維度的數值數組,可以表示各種數據,如標量(0D張量,單個數值)、向量(1D張量,一維數組)、矩陣(2D張量,二維數組),以及更高維度的數據結構。在深度學習中,神經網絡的輸入、中間表示和輸出通常都表示為張量,這使得神經網絡能夠處理多維度的數據,並進行複雜的數學運算,單看文字不好理解可以看看下圖:
https://ithelp.ithome.com.tw/upload/images/20230921/201631849aKrQNsfO4.png

圖片來源:https://medium.com/hunter-cheng/%E6%A9%9F%E4%BD%95%E7%82%BA%E5%BC%B5%E9%87%8F-tensor-%E4%B8%89%E5%88%86%E9%90%98%E5%9C%96%E8%A7%A3%E9%A1%9E%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF%E5%9F%BA%E6%9C%AC%E8%B3%87%E6%96%99%E7%B5%90%E6%A7%8B-ab0ccd115aff

模型詳細說明

# 引入必要的函式庫
import numpy as np #引入NumPy庫並使用"np"別名,用於數組和矩陣處理。
import tensorflow as tf # 引入TensorFlow深度學習框架並使用"tf"別名。
from tensorflow.keras import layers, models #引入TensorFlow的Keras模型和層次結構。
from tensorflow.keras.datasets import mnist #引入手寫數字MNIST數據集。
from tensorflow.keras.utils import to_categorical #引入將標籤轉換為獨熱編碼的函數。
  • from xxx import xxx 前面沒有提到fromfrom是讓我們從函式庫拿出我們所需要部分,如果import是整個工具組,那麼from xxx import xxx就是從工具組裡只拿我們要的。
  • import xxx as xxxPython中通常用於給函式庫、模塊或對象指定別名(alias),如上面就將numpy函式庫以np當作別名(就是跟電腦說之後我要簡稱什麼),可以讓畫面更簡潔外使得代碼更易於維護和理解。
# 載入MNIST數據集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

mnist.load_data():這是一個函數調用,用於從網絡下載MNIST數據集,並將數據分別放在指定位置裡,這裡稍微說明mnist數據集,下載下來的資料有4份gz檔,分為 images(圖片)laels(標籤) 的訓練與驗證集,訓練有60000張圖片,驗證集有10000張圖片。
https://ithelp.ithome.com.tw/upload/images/20230921/20163184PpvFQf0OvY.png


# 數據預處理
train_images = train_images.reshape((60000, 28, 28, 1)) #圖片形狀調整為(樣本數, 圖像長度, 圖像寬度, 圖像通道數)
test_images = test_images.reshape((10000, 28, 28, 1)) #同上
train_images = train_images.astype('float32') / 255 #歸一化
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels) #標籤轉換
test_labels = to_categorical(test_labels)

數據預處理的步驟,通常在深度學習任務中執行,主要是為了確保輸入數據符合模型的需求和提高模型的訓練效果。以下是每個步驟的解釋:

  • reshape 形狀調整
    在這裡一二行是對下載的圖像使用reshape函數將形狀調整為(樣本數, 圖像長度, 圖像寬度, 圖像通道數),圖像通道則是看圖片樣,如彩色式RGB構成則通道為3,這裡是黑白(灰階)則是1,所以依照你輸入檔案更改圖像通道數。

  • 圖像歸一化
    第三四行我們利用astype將檔案轉為float32,然後每個數值除以255(圖像像素通常具有不同的值範圍,一般在 0 到 255 之間如下圖)讓數值可以在[0, 1] 範圍內。

https://ithelp.ithome.com.tw/upload/images/20230921/2016318406lEzaT3Pg.png

圖片來源:https://blog.csdn.net/weixin_45277161/article/details/123642040

  • 獨熱編碼(One-Hot Encoding)

在分類任務中,標籤通常是整數,表示不同的類別,但深度學習模型通常需要將標籤轉換為獨熱編碼形式,在這裡 to_categorical 用於執行這個轉換,將整數標籤轉換為二進制向量,其中只有一個元素是1,其他元素都是0,用於表示標籤的一種方法。
這樣解釋可能有點模糊,讓我們看下面圖片來理解。
https://ithelp.ithome.com.tw/upload/images/20230921/20163184YBhlrHqP2a.png

# 建立神經網絡模型
model = models.Sequential() #創建了一個名為 model 的神經網絡模型
model.add(layers.Flatten(input_shape=(28, 28, 1)))  # 將圖像展平成一維數組
model.add(layers.Dense(512, activation='relu'))  # 512個神經元的全連接層
model.add(layers.Dense(10, activation='softmax'))  # 10個神經元的全連接層(用於10個類別的分類)

一樣讓我們由上而下講解

  • Sequential模型是Keras中的一種簡單線性堆疊模型,主要理解就是這行代碼創建了一個名為 model 的神經網絡模型。
  • 攤平(Flatten)用於將輸入的多維數據(在這種情況下是28x28的圖像)展平成一維數組(上面張量解釋),以便後續的全連接層可以處理它們,input_shape 參數指定了輸入數據的形狀。
  • add 第三四行這裡向模型中添加了兩個全連接層(Dense層),第一層包含512個神經元,激勵函數是ReLU;第二層包含10個神經元(1到10)激勵是Softmax(配合獨熱編碼),將模型的輸出轉換為每個類別的概率分佈,以便進行分類。。

全連接層 (Dense層) 是深度學習中的一種神經網絡層次結構,其每個神經元都與上一層的所有神經元相連(若隱藏層與輸出層一樣與上一層全連接也會稱為全連接層),用於實現高級特徵的學習和複雜的數據轉換。

# 編譯模型
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
              

這一行代碼使用compile方法來編譯神經網絡模型,在這需要指定三個重要的參數:

  • optimizer 優化器決定了模型在訓練過程中如何進行權重更新。在這裡,使用了 adam優化器,它是一種常用的隨機梯度下降算法的變種,通常在深度學習中表現良好。

  • loss 損失函數用來評估模型預測值與實際標籤之間的差異的指標。在這裡使用了categorical_crossentropy 損失函數,通常用於多類別分類問題,特別是當目標是獨熱編碼(one-hot encoding)時。

  • metrics=['accuracy']:這一行指定了模型在訓練和測試過程中要計算的性能指標。在這裡,只計算了準確度(accuracy)


# 訓練模型
model.fit(train_images, train_labels, epochs=5, batch_size=64)

這裡比較容易理解,分別為:(丟入訓練集images檔,丟入訓練集labels檔,訓練次數,每次訓練的檔案數)

可以調高訓練次數或者每次訓練檔案量看看有什麼結果~

# 評估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)

  • 第一行代碼使用了test_images作為輸入數據,並使用test_labels作為對應的真實標籤。模型將在測試數據上進行預測,然後計算測試 損失(test_loss) 和測試 準確度(test_acc)

簡單來說就是讓模型判斷你測試集的圖片並列出他的標籤,再與真實標籤對照來判斷是否正確,以此計算損失與準確度等數據。

  • 最後一行則是使用前面講過的 print() 來列出最後準確率。

以上是對昨天程式的詳細解釋,會注意到前面開頭提到很多都跟數學相關,畢竟回歸原點神經網路就是在做函數的運算,對這些想要更了解的可以在YT上找李宏毅,老師的影片當中講解很詳細(在中文界講解機器學習很有名),今天就到這邊結束,後續會再對於訓練次數,準確率損失率等再多加講解並圖形化,各位明天見嚕~~


上一篇
【Day5】AI到神經網路~基本概念到Keras神經網絡
下一篇
【Day7】只看正確率不準? Loss值搭配與模型好壞~
系列文
「AI之旅:Python、Keras、PyTorch」 - 深度學習與數據入門挑戰22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言