深度學習框架 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
內容解密:
- logging 模組用於設定日誌組態和記錄日誌訊息,在
DiabetesProcessor和DiabetesModelTrainer類別中用於記錄資料預處理和模型訓練的資訊。 - SparkSession 用於建立 Spark 工作階段,是與 Spark 互動和執行 DataFrame 操作的基礎。
- VectorAssembler 和 StandardScaler 用於組裝特徵向量和縮放特徵,在
DiabetesProcessor類別中用於資料預處理。 - col 函式用於存取 DataFrame 的欄位,在
DiabetesProcessor類別中用於過濾資料。 - accuracy_score、precision_score、recall_score 和 f1_score 用於計算模型的評估指標,在
DiabetesModelEvaluator類別中用於評估 TensorFlow (Keras) 模型的效能。 - Sequential 用於定義 Keras 模型的架構,在
DiabetesModelTrainer類別中用於定義神經網路模型的架構。 - Dense 和 ReLU 用於指定全連線層和啟用函式,在
DiabetesModelTrainer類別中用於指定神經網路模型的層。 - SGD 用於指定隨機梯度下降的最佳化器,在
DiabetesModelTrainer類別中用於編譯 Keras 模型。 - Callback 用於定義自定義的 Keras 回撥函式,在
DiabetesModelTrainer類別中用於記錄 epoch 資訊。 - numpy 用於科學計算,提供多維陣列和數學函式的支援,在程式碼中用於將 PySpark DataFrame 轉換為 NumPy 陣列進行模型訓練和評估。
步驟 2:設定日誌組態
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
內容解密:
logging.basicConfig(level=logging.INFO)設定了日誌的基本組態,將日誌等級設為 INFO 等級,表示記錄 INFO 等級以上的日誌訊息。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__)
內容解密:
logging.basicConfig(level=logging.INFO):初始化 Python 的日誌系統,並設定日誌級別為INFO,意味著只有INFO、WARNING、ERROR和CRITICAL級別的日誌會被記錄,而DEBUG級別的日誌將被忽略。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}"
)
內容解密:
CustomCallback類別繼承自 Keras 的Callback類別,允許我們在模型訓練的不同階段執行自定義操作。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)}")
內容解密:
- 使用
spark.read.csv讀取 CSV 檔案中的糖尿病資料,並過濾掉無效資料(例如血糖、血壓或 BMI 為零的紀錄)。 - 使用
VectorAssembler將選定的特徵欄位組合成一個特徵向量,並使用StandardScaler對特徵向量進行標準化。 - 將預處理後的資料分割成訓練集和測試集,並將其儲存為 Parquet 檔案。
本章節介紹瞭如何使用 Keras 自定義回呼函式來監控模型訓練過程,以及如何使用 PySpark 對 Pima 糖尿病資料進行預處理,為後續的深度學習模型訓練做好準備。
深度學習模型訓練與評估:以TensorFlow為例
在建立糖尿病預測模型的過程中,資料預處理、模型定義、訓練及評估為關鍵步驟。本文將探討如何使用TensorFlow(Keras)進行模型的訓練與評估,並介紹相關的程式碼實作。
資料預處理
在進行模型訓練之前,資料預處理是不可或缺的一步。資料預處理的目的是將原始資料轉換成適合模型訓練的格式。在本例中,使用了PySpark進行資料預處理,包括以下步驟:
- 使用
VectorAssembler和StandardScaler對輸入的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分數等評估指標。
內容解密:
- 資料預處理的重要性:在機器學習流程中,資料預處理是至關重要的一步,直接影響模型的效能。
- Parquet格式的應用:Parquet格式因其高效的儲存和查詢能力,在大資料處理中被廣泛採用。
- TensorFlow模型的定義與訓練:透過Keras API可以簡化模型的定義和訓練過程,提高開發效率。
- 模型評估的多維度指標:使用多種評估指標可以全面評估模型的效能,為模型的改進提供依據。