iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
AI/ ML & Data

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

[Day 18] 認識深度學習的Hello World! MNIST訓練資料

  • 分享至 

  • xImage
  •  

前言

在學每一個新的程式語言的時候,相信大家第一個寫的一定都是Hello World!吧,那在深度學習領域中,最經典的就是MNIST手寫辨識了。
今天我們會透過tensorflow並基於CNN來打造一個簡單的訓練,如果忘記CNN是什麼的可以複習一下喔。

MNIST介紹

MNIST 包含了 60,000 個訓練範例和 10,000 個測試範例。每個範例都是一個28x28像素的灰階影像,代表一個0-9的手寫數字。每個影像都有一個對應的標籤,表示那個影像的數字。
image

tensorflow介紹

TensorFlow是一個用於機器學習和人工智慧的免費的開源軟體庫,用於各種機器學習與數據處理任務,特別是深度神經網路的訓練和推理。 TensorFlow是由Google Brain團隊開發,最初主要用於Google內部的研究和生產,如語音識別、Gmail、相冊和搜索等

建立程式

  1. 首先我們必須引入我們會用到的庫
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
  1. 載入數據
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
  • from tensorflow.keras import datasets:

    • 這行程式碼導入了 tensorflow.keras 中的 datasets 模組,以便使用內置的數據集。
  • (train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data():

    • 這行程式碼從 MNIST 數據集中加載訓練數據和測試數據。
    • train_images 和 train_labels 分別是訓練數據的圖像和標籤。
    • test_images 和 test_labels 分別是測試數據的圖像和標籤。
    • 我們將資料輸出出來看看他長怎麼樣
    • image
  • train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255:

    • 這行程式碼對訓練圖像進行重塑和歸一化處理。
    • train_images.reshape((60000, 28, 28, 1)) 將原本形狀為 (60000, 28, 28) 的數據重塑為 (60000, 28, 28, 1),以適應卷積神經網路的輸入要求。這裡的 1 表示單通道(灰度圖像)。
    • .astype('float32') 將數據類型轉換為 float32。
    • / 255 將圖像數據歸一化到 [0, 1] 範圍。
  • test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255:

    • 這行程式碼對測試圖像進行重塑和歸一化處理,步驟與訓練圖像相同。
    • test_images.reshape((10000, 28, 28, 1)) 將形狀為 (10000, 28, 28) 的數據重塑為 (10000, 28, 28, 1)。
    • .astype('float32') 將數據類型轉換為 float32。
    • / 255 將圖像數據歸一化到 [0, 1] 範圍。
      相同的,我們將資料輸出看看,看看從第二步到第四步資料集發格式發生了甚麼變化。
      image

這些步驟是訓練卷積神經網路(CNN)之前常見的數據預處理方法,目的是確保數據形狀和數據範圍適合神經網路的輸入要求。

接著再往下會使用到一個叫做激勵函數的東西,那我們先來了解激勵函數是甚麼吧。

激勵函數(Activation Function)

由於類神經網路在訓練時,會以線性的模式進行求解,但實際的問題經常為非線性的,因此需要使用激勵函數。激勵函數的作用是增加類神經網路的非線性特徵,使得網路能夠更準確地分析和預測複雜的數據模式。常見的激勵函數包括 ReLU、SeLU、Softmax 和 Sigmoid 函數。

下面我只介紹最常用的ReLU激勵函數

  • ReLU (Rectified Linear Unit)
    ReLU(修正線性單元)是目前最常用的激勵函數。它的數學形式可以表示為:
    https://ithelp.ithome.com.tw/upload/images/20240926/2015922527ciWl6XIn.png

image

在這個圖片可以更清楚的發現,ReLU 的優點在於它在正值區間保持線性,且在負值區間輸出為零,這使得它在前向傳播時能夠保留梯度訊息,避免梯度消失問題

什麼是梯度消失問題呢?

  • 梯度消失問題的形成:

    • 當神經網路非常深時,誤差函數的梯度在從輸出層向輸入層反向傳播的過程中,可能會逐層縮小。
    • 特別是在使用 Sigmoid 或 Tanh 等激勵函數時,這些函數的導數在輸入值非常大或非常小時趨近於零。
    • 因此,在多層網路中,這些趨近於零的導數會使得整個網路的梯度逐層減小,最終在早期層幾乎消失。
  • 結果:

    • 當梯度非常小時,每次迭代權重的更新值也會非常小,導致訓練進程非常緩慢。
    • 在極端情況下,梯度可能會小到無法有效更新權重,使得網路無法學習。
    • 這可能導致神經網路無法達到收斂或完全停止訓練。

結語

今天我們先到這裡吧,透過了解基本引入資料及激勵函數,明天我們就可以繼續打造我們的數字預測囉。


上一篇
[Day 17] LSTM:突破RNN限制的長短期記憶網路
下一篇
[Day19] 打造深度學習的 HELLO WORLD!建構卷積神經網路
系列文
深度學習的學習之旅:從理論到實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言