返回文章列表

Keras PyTorch TensorFlow 模型訓練評估比較

本文比較 Keras、PyTorch 和 TensorFlow 三個深度學習框架在模型訓練和評估方面的差異,並以 TensorFlow 糖尿病分類別程式碼為例,說明如何使用 Keras 建立、訓練和評估模型,同時探討 PySpark 在資料預處理中的應用,以及 Parquet 格式的優勢。

深度學習 機器學習

深度學習框架 Keras、PyTorch 與 TensorFlow 在模型訓練和評估上各有千秋。Keras 提供高階 API 簡化訓練流程,適合快速原型開發;PyTorch 則提供低階 API,賦予開發者高度彈性與控制力。TensorFlow 則兼具高低階 API 的特性,並擁有豐富的生態系統。本文將以 TensorFlow 的糖尿病分類別程式碼為例,逐步解析模型訓練與評估的流程,包含資料預處理、模型建構、訓練及評估等環節,並探討如何利用 PySpark 進行資料預處理及 Parquet 格式的優點。透過實際案例,展現 TensorFlow 在處理分類別任務的實用性,並提供程式碼範例與說明,讓讀者更深入理解 TensorFlow 的應用。

Keras、PyTorch 與 TensorFlow 在模型訓練與評估的比較分析

在深度學習框架中,Keras、PyTorch 和 TensorFlow 是三個最為流行的工具,它們在模型訓練和評估方面各具特色。本篇文章將探討這三個框架在模型訓練和評估過程中的差異,並透過 TensorFlow 的實際程式碼範例來展示其在分類別任務中的應用。

模型訓練流程的比較

Keras 的高階 API

Keras 提供了一個高階的 model.fit() 方法,用於自動化模型訓練流程。這個方法封裝了迭代 epoch 和 batch、計算損失和執行最佳化步驟等細節,極大地簡化了模型訓練的過程。這種設計使得 Keras 特別適合於快速原型開發和實驗。

PyTorch 的低階 API

相比之下,PyTorch 需要使用者手動實作訓練迴圈,包括迭代 epoch 和 batch、計算損失和執行最佳化步驟等。雖然這種方法更加冗長,但它提供了更大的彈性和控制權,讓使用者能夠實作自定義的訓練程式和嘗試不同的最佳化技術。

模型評估方法的比較

Keras 的內建評估方法

Keras 提供了一個方便的 model.evaluate() 方法,用於評估模型的效能。這個方法計算了諸如準確率、損失等評估指標,並傳回指定的評估結果。這種簡化的評估流程使得使用者能夠輕鬆地獲得模型的效能指標。

PyTorch 的自定義評估

在 PyTorch 中,模型評估通常需要手動計算評估指標,可以使用外部函式庫如 Scikit-Learn 或實作自定義的評估函式。雖然 PyTorch 沒有直接等同於 model.evaluate() 的方法,但它提供了自定義評估流程的彈性,讓使用者能夠更精細地控制評估指標和程式。

TensorFlow 在分類別任務中的應使用案例項

接下來,我們將逐步分析 TensorFlow 在糖尿病分類別任務中的程式碼實作。

步驟 1:匯入必要的函式庫

import logging
from pyspark.sql import SparkSession
from pyspark.ml.feature import VectorAssembler, StandardScaler
from pyspark.sql.functions import col
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, ReLU
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.callbacks import Callback
import numpy as np

內容解密:

  1. logging 模組用於設定日誌組態和記錄日誌訊息,在 DiabetesProcessorDiabetesModelTrainer 類別中用於記錄資料預處理和模型訓練的資訊。
  2. SparkSession 用於建立 Spark 工作階段,是與 Spark 互動和執行 DataFrame 操作的基礎。
  3. VectorAssemblerStandardScaler 用於組裝特徵向量和縮放特徵,在 DiabetesProcessor 類別中用於資料預處理。
  4. col 函式用於存取 DataFrame 的欄位,在 DiabetesProcessor 類別中用於過濾資料。
  5. accuracy_scoreprecision_scorerecall_scoref1_score 用於計算模型的評估指標,在 DiabetesModelEvaluator 類別中用於評估 TensorFlow (Keras) 模型的效能。
  6. Sequential 用於定義 Keras 模型的架構,在 DiabetesModelTrainer 類別中用於定義神經網路模型的架構。
  7. DenseReLU 用於指定全連線層和啟用函式,在 DiabetesModelTrainer 類別中用於指定神經網路模型的層。
  8. SGD 用於指定隨機梯度下降的最佳化器,在 DiabetesModelTrainer 類別中用於編譯 Keras 模型。
  9. Callback 用於定義自定義的 Keras 回撥函式,在 DiabetesModelTrainer 類別中用於記錄 epoch 資訊。
  10. numpy 用於科學計算,提供多維陣列和數學函式的支援,在程式碼中用於將 PySpark DataFrame 轉換為 NumPy 陣列進行模型訓練和評估。

步驟 2:設定日誌組態

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

內容解密:

  1. logging.basicConfig(level=logging.INFO) 設定了日誌的基本組態,將日誌等級設為 INFO 等級,表示記錄 INFO 等級以上的日誌訊息。
  2. logger = logging.getLogger(__name__) 建立了一個日誌記錄器物件,用於在程式碼中記錄日誌訊息。__name__ 是目前模組的名稱,這樣設定的日誌記錄器可以根據模組名稱進行區分。

使用 Keras 自定義回呼函式與 PySpark 進行糖尿病資料預處理

在深度學習模型訓練過程中,Keras 提供了回呼函式(Callback)機制來實作自定義操作,例如在特定訓練階段執行額外操作或記錄訓練過程中的指標。本章節將介紹如何使用 Keras 自定義回呼函式以及如何使用 PySpark 對 Pima 糖尿病資料進行預處理。

設定日誌系統

首先,我們需要設定 Python 的日誌系統,以用於記錄訓練過程中的重要資訊。以下程式碼初始化日誌系統並設定日誌級別為 INFO

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

內容解密:

  1. logging.basicConfig(level=logging.INFO):初始化 Python 的日誌系統,並設定日誌級別為 INFO,意味著只有 INFOWARNINGERRORCRITICAL 級別的日誌會被記錄,而 DEBUG 級別的日誌將被忽略。
  2. logger = logging.getLogger(__name__):建立一個名為 logger 的日誌物件,其名稱與目前模組名稱相同,有助於識別日誌訊息的來源。

自定義 Keras 回呼函式

接下來,我們定義一個名為 CustomCallback 的自定義 Keras 回呼函式,用於在訓練過程中每隔 10 個 epoch 列印一次訓練資訊:

from keras.callbacks import Callback

class CustomCallback(Callback):
    """自定義 Keras 回呼函式,用於列印 epoch 資訊。"""
    def on_epoch_end(self, epoch, logs=None):
        """在每個 epoch 結束時被呼叫,用於列印 epoch 資訊。"""
        if (epoch + 1) % 10 == 0:
            logger.info(
                f"Epoch [{epoch + 1}/{self.params['epochs']}], "
                f"Loss: {logs['loss']:.4f}"
            )

內容解密:

  1. CustomCallback 類別繼承自 Keras 的 Callback 類別,允許我們在模型訓練的不同階段執行自定義操作。
  2. on_epoch_end 方法在每個 epoch 結束時被呼叫,用於檢查是否達到每 10 個 epoch 的條件,並使用 logger.info 列印當前 epoch 資訊,包括 epoch 編號、總 epoch 數和損失值。

使用 PySpark 進行資料預處理

現在,我們使用 PySpark 對 Pima 糖尿病資料進行預處理。以下程式碼定義了一個名為 DiabetesProcessor 的類別,用於讀取資料、過濾無效資料、進行特徵工程以及儲存預處理後的資料:

from pyspark.ml.feature import VectorAssembler, StandardScaler
from pyspark.sql.functions import col

class DiabetesProcessor:
    """用於預處理糖尿病資料的類別。"""
    @staticmethod
    def preprocess_data(spark, data_file_path, train_parquet_path, test_parquet_path):
        """使用 PySpark 預處理糖尿病資料。"""
        try:
            diabetes_df = spark.read.csv(data_file_path, header=True, inferSchema=True)
            diabetes_df = diabetes_df.filter((col("Glucose") != 0) & (col("BloodPressure") != 0) & (col("BMI") != 0))
            
            feature_cols = ["Pregnancies", "Glucose", "BloodPressure", "BMI", "DiabetesPedigreeFunction", "Age"]
            assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
            diabetes_df = assembler.transform(diabetes_df)
            
            scaler = StandardScaler(inputCol="features", outputCol="scaled_features")
            scaler_model = scaler.fit(diabetes_df)
            diabetes_df = scaler_model.transform(diabetes_df)
            
            train_df, test_df = diabetes_df.randomSplit([0.8, 0.2], seed=42)
            train_df.write.parquet(train_parquet_path, mode="overwrite")
            test_df.write.parquet(test_parquet_path, mode="overwrite")
            logger.info("資料預處理完成。")
        except Exception as e:
            logger.error(f"資料預處理過程中發生錯誤:{str(e)}")

內容解密:

  1. 使用 spark.read.csv 讀取 CSV 檔案中的糖尿病資料,並過濾掉無效資料(例如血糖、血壓或 BMI 為零的紀錄)。
  2. 使用 VectorAssembler 將選定的特徵欄位組合成一個特徵向量,並使用 StandardScaler 對特徵向量進行標準化。
  3. 將預處理後的資料分割成訓練集和測試集,並將其儲存為 Parquet 檔案。

本章節介紹瞭如何使用 Keras 自定義回呼函式來監控模型訓練過程,以及如何使用 PySpark 對 Pima 糖尿病資料進行預處理,為後續的深度學習模型訓練做好準備。

深度學習模型訓練與評估:以TensorFlow為例

在建立糖尿病預測模型的過程中,資料預處理、模型定義、訓練及評估為關鍵步驟。本文將探討如何使用TensorFlow(Keras)進行模型的訓練與評估,並介紹相關的程式碼實作。

資料預處理

在進行模型訓練之前,資料預處理是不可或缺的一步。資料預處理的目的是將原始資料轉換成適合模型訓練的格式。在本例中,使用了PySpark進行資料預處理,包括以下步驟:

  • 使用VectorAssemblerStandardScaler對輸入的DataFrame進行轉換,產生新的DataFrame以包含轉換後的特徵。
  • 將預處理後的資料分成訓練集和測試集,使用PySpark的randomSplit()方法,以確保模型在訓練集上進行訓練,並在測試集上進行評估。
  • 將預處理後的資料儲存為Parquet檔案,以便於後續使用。

Parquet格式的優勢

Parquet是一種列式儲存格式,具有高效儲存、內建壓縮和與大資料處理框架相容等優點。Parquet格式支援schema演化,可以在不重寫整個資料集的情況下新增或刪除列,這在動態生產環境中非常有價值。

模型定義與訓練

DiabetesModelTrainer類別

DiabetesModelTrainer類別負責訓練TensorFlow(Keras)模型。該類別包含一個靜態方法train_tensorflow_model(),用於訓練模型。

class DiabetesModelTrainer:
    @staticmethod
    def train_tensorflow_model(X_train, y_train, epochs=100, lr=0.01):
        try:
            model = Sequential([
                Dense(64, input_dim=X_train.shape[1]),
                ReLU(),
                Dense(32),
                ReLU(),
                Dense(16),
                ReLU(),
                Dense(1, activation='sigmoid')
            ])
            optimizer = SGD(learning_rate=lr)
            model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
            custom_callback = CustomCallback()
            model.fit(X_train, y_train, epochs=epochs, verbose=0, callbacks=[custom_callback])
            logger.info("模型訓練完成。")
            return model
        except Exception as e:
            logger.error(f"模型訓練過程中發生錯誤:{str(e)}")

模型架構與編譯

train_tensorflow_model()方法中,定義了一個使用Keras Sequential API的神經網路模型。該模型包含多個全連線層(Dense),使用ReLU作為啟用函式,最後一層使用sigmoid啟用函式。模型使用二元交叉熵損失函式和準確率作為評估指標。

模型訓練

使用fit()方法對模型進行訓練,傳入訓練特徵(X_train)和目標標籤(y_train),並指定訓練的epoch數量。custom_callback用於記錄訓練過程中的資訊。

模型評估

DiabetesModelEvaluator類別

DiabetesModelEvaluator類別負責評估訓練好的TensorFlow(Keras)模型的效能,包括準確率、精確率、召回率和F1分數等評估指標。

內容解密:

  1. 資料預處理的重要性:在機器學習流程中,資料預處理是至關重要的一步,直接影響模型的效能。
  2. Parquet格式的應用:Parquet格式因其高效的儲存和查詢能力,在大資料處理中被廣泛採用。
  3. TensorFlow模型的定義與訓練:透過Keras API可以簡化模型的定義和訓練過程,提高開發效率。
  4. 模型評估的多維度指標:使用多種評估指標可以全面評估模型的效能,為模型的改進提供依據。