[深度學習][Python]多層感知器(MLP)模型使用不同激活函數(ReLU 和 Sigmoid)的效果

閱讀時間約 8 分鐘

本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。

一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。

relu vs sigmoid

relu vs sigmoid

函數定義

Sigmoid 函數

Sigmoid 函數將輸入壓縮到 0到 1 之間:

特性:

  • 輸出範圍是 (0,1)(0, 1)(0,1)。
  • 當 xxx 趨向無窮大時,輸出趨向於 1;當 xxx 趨向負無窮大時,輸出趨向於 0。

ReLU 函數

ReLU 函數只保留正數,將負數輸出為 0:

特性:

  • 輸出範圍是 [0,∞]。
  • 將所有負輸入值壓縮為 0,正輸入值保持不變。

2. 梯度特性

Sigmoid 函數

  • Sigmoid 函數的梯度在輸入值非常大或非常小時會趨近於 0,這會導致梯度消失問題(Gradient Vanishing Problem)。
  • 當激活值接近 0 或 1 時,導數值變得非常小,從而導致梯度傳遞到前幾層時變得幾乎為零,訓練變得非常緩慢。

ReLU 函數

  • ReLU 的梯度在正值範圍內為 1,在負值範圍內為 0。
  • ReLU 避免了梯度消失問題,因為在正值範圍內梯度不會變小。
  • 但是,ReLU 存在「神經元死亡」問題,即如果一個神經元的輸出總是負值,它的梯度將永遠是 0,該神經元將不再更新。

3. 計算效率

Sigmoid 函數

  • 計算 Sigmoid 涉及到指數運算,這在計算上相對比較昂貴。

ReLU 函數

  • ReLU 只需簡單的比較和取最大值運算,計算效率非常高。

4. 適用場景

Sigmoid 函數

  • 常用於輸出層,特別是在二元分類問題中。

ReLU 函數

  • 常用於隱藏層,在大多數現代神經網絡架構中是首選激活函數。

程式範例

import tensorflow as tf
from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
import matplotlib.pyplot as plt

# 載入 Fashion-MNIST 資料集
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()

# 標準化影像數據到 [0, 1] 範圍
x_train = x_train / 255.0
x_test = x_test / 255.0

# 定義模型架構
def create_model(activation):
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation=activation),
Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model

# 創建兩個模型,一個使用 ReLU,另一個使用 Sigmoid
model_relu = create_model('relu')
model_sigmoid = create_model('sigmoid')

# 訓練模型
history_relu = model_relu.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test), verbose=2)
history_sigmoid = model_sigmoid.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test), verbose=2)

# 評估模型
test_loss_relu, test_acc_relu = model_relu.evaluate(x_test, y_test, verbose=2)
test_loss_sigmoid, test_acc_sigmoid = model_sigmoid.evaluate(x_test, y_test, verbose=2)

print(f"ReLU Model Test Accuracy: {test_acc_relu}")
print(f"Sigmoid Model Test Accuracy: {test_acc_sigmoid}")

# 繪製訓練過程中的準確度和損失
plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
plt.plot(history_relu.history['accuracy'], label='ReLU Train Accuracy')
plt.plot(history_relu.history['val_accuracy'], label='ReLU Val Accuracy')
plt.plot(history_sigmoid.history['accuracy'], label='Sigmoid Train Accuracy')
plt.plot(history_sigmoid.history['val_accuracy'], label='Sigmoid Val Accuracy')
plt.title('Model Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(history_relu.history['loss'], label='ReLU Train Loss')
plt.plot(history_relu.history['val_loss'], label='ReLU Val Loss')
plt.plot(history_sigmoid.history['loss'], label='Sigmoid Train Loss')
plt.plot(history_sigmoid.history['val_loss'], label='Sigmoid Val Loss')
plt.title('Model Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()

plt.tight_layout()
plt.show()

繪製訓練過程

繪製訓練過程中的準確度和損失

繪製訓練過程中的準確度和損失

準確率高

raw-image


結果與比較

  • ReLU(Rectified Linear Unit):通常在深度學習中效果更好,因為它在正值範圍內有較好的梯度傳遞效果,能夠減少梯度消失問題。
  • Sigmoid:在多層神經網絡中可能會遇到梯度消失問題,使得訓練變慢且難以收斂。

透過這個程式範例,你可以觀察到使用不同激活函數的模型在準確度ReLU 0.875Sigmoid 0.872好一點,由繪製訓練過程上來看ReLU收斂速度比Sigmoid來的快收斂。通常來說,ReLU 會比 Sigmoid 表現更好一點。




avatar-img
128會員
213內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
本文主要應用deepface的正面(frontal)人臉檢測的預設模型,使用analyze 函數,用於分析一張人臉圖像的情感(emotion)。 在Colab上實現,若用其他平台需稍微修改程式碼。 Deepface Deepface是一個輕量級的Python人臉辨識和臉部屬性分析
Google Tesseract Config說明,程式範例實際修改示範 前言 Tesseract 的 config 檔案用於指定 OCR 引擎的設定和參數。這些參數可以影響文本識別的結果 本文將彙整常用參數調整,並呈現不同參數出現不同的辨識結果 官網Tesseract OCR參數說明連結
使用Google Tesseract應用,擷取圖像的OCR並將讀取到的字元標註在原圖上 光學字元辨識功能 (Optical character recognition,光學字符辨識) 可以將影像中特徵範圍內的文本轉換為數字形式的文本。使用前必須安装Google Tesseract並更新
python Streamlit連動github程式碼實現YoloV8網頁版偵測物件 先致敬,YoloV8原作Github程式碼 Streamlit網頁 實現YoloV8 偵測物件 套用模型為YoloV8(YOLOv8n)最小模型,因github上傳檔案最大上限為25mb 導入圖像(搜尋街景
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
本文主要應用deepface的正面(frontal)人臉檢測的預設模型,使用analyze 函數,用於分析一張人臉圖像的情感(emotion)。 在Colab上實現,若用其他平台需稍微修改程式碼。 Deepface Deepface是一個輕量級的Python人臉辨識和臉部屬性分析
Google Tesseract Config說明,程式範例實際修改示範 前言 Tesseract 的 config 檔案用於指定 OCR 引擎的設定和參數。這些參數可以影響文本識別的結果 本文將彙整常用參數調整,並呈現不同參數出現不同的辨識結果 官網Tesseract OCR參數說明連結
使用Google Tesseract應用,擷取圖像的OCR並將讀取到的字元標註在原圖上 光學字元辨識功能 (Optical character recognition,光學字符辨識) 可以將影像中特徵範圍內的文本轉換為數字形式的文本。使用前必須安装Google Tesseract並更新
python Streamlit連動github程式碼實現YoloV8網頁版偵測物件 先致敬,YoloV8原作Github程式碼 Streamlit網頁 實現YoloV8 偵測物件 套用模型為YoloV8(YOLOv8n)最小模型,因github上傳檔案最大上限為25mb 導入圖像(搜尋街景
你可能也想看
Google News 追蹤
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
在進行多層次線性模型(MLM)當中,有時候我們不只會加入層次1的預測變項。我們也會想加入層次2預測變項。本文將介紹加入層次2預測變項的各種模型,並解釋其公式和R語言操作方法。因為內容比較多,所以篇幅比較長。 多層次線性模型(MLM),截距是表示所有學校的平均值。斜率是指模型中自變量的係數,表
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 從 AI說書 - 從0開始 - 82 到 AI說書 - 從0開始 - 85 的說明,有一個很重要的結論:最適合您的模型不一定是排行榜上最好的模型,您需要學習 NLP 評
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 Transformer 可以透過繼承預訓練模型 (Pretrained Model) 來微調 (Fine-Tune) 以執行下游任務。 Pretrained Mo
前言 在閱讀《強化式學習:打造最強 AlphaZero 通用演算法》時,對一些看似基本,但是重要且會影響到之後實作的項目概念有點疑惑,覺得應該查清楚,所以搞懂後記錄下來,寫下這篇文章(應該說是筆記?)。 正文 下面這段程式碼: model = Sequential() model.add
為了將輸入文本轉換成深度學習模型可以使用的嵌入向量, 我們需要先將「輸入文本 Input Text」轉為「符元化文本 Tokenized Text」。 而實際上「符元化文本 Tokenized Text」與「嵌入向量 Embedding Vector」之間, 還有一個步驟稱為「符元
這篇文章介紹瞭如何使用sigmoid函數來解決函數過於簡單導致的模型偏差問題,並透過尋找函數和參數來逼近precise linear curve。另外,也講述瞭如何尋找讓損失函數最小的參數以及使用batch和反覆進行Sigmoid的方法。
Thumbnail
本文章探討了多智能體系統(MAS)在生成式AI領域中的應用,以及GenAI對於AI_MCU和Software defined hardware的影響。文章還總結了SDH設計模式對數據科學和人工智能時代的影響,並提供了有關GenAI的一些額外信息。
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
在進行多層次線性模型(MLM)當中,有時候我們不只會加入層次1的預測變項。我們也會想加入層次2預測變項。本文將介紹加入層次2預測變項的各種模型,並解釋其公式和R語言操作方法。因為內容比較多,所以篇幅比較長。 多層次線性模型(MLM),截距是表示所有學校的平均值。斜率是指模型中自變量的係數,表
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 從 AI說書 - 從0開始 - 82 到 AI說書 - 從0開始 - 85 的說明,有一個很重要的結論:最適合您的模型不一定是排行榜上最好的模型,您需要學習 NLP 評
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 Transformer 可以透過繼承預訓練模型 (Pretrained Model) 來微調 (Fine-Tune) 以執行下游任務。 Pretrained Mo
前言 在閱讀《強化式學習:打造最強 AlphaZero 通用演算法》時,對一些看似基本,但是重要且會影響到之後實作的項目概念有點疑惑,覺得應該查清楚,所以搞懂後記錄下來,寫下這篇文章(應該說是筆記?)。 正文 下面這段程式碼: model = Sequential() model.add
為了將輸入文本轉換成深度學習模型可以使用的嵌入向量, 我們需要先將「輸入文本 Input Text」轉為「符元化文本 Tokenized Text」。 而實際上「符元化文本 Tokenized Text」與「嵌入向量 Embedding Vector」之間, 還有一個步驟稱為「符元
這篇文章介紹瞭如何使用sigmoid函數來解決函數過於簡單導致的模型偏差問題,並透過尋找函數和參數來逼近precise linear curve。另外,也講述瞭如何尋找讓損失函數最小的參數以及使用batch和反覆進行Sigmoid的方法。
Thumbnail
本文章探討了多智能體系統(MAS)在生成式AI領域中的應用,以及GenAI對於AI_MCU和Software defined hardware的影響。文章還總結了SDH設計模式對數據科學和人工智能時代的影響,並提供了有關GenAI的一些額外信息。