模型訓練
模型訓練 API 與 tf.keras.Model 模塊提供的 API 基本一致,關于 tf.keras.Model 模塊的更多信息請參見 tf.keras。
本文涉及 API 中所有的占位符,例如"$df0"
,必須包含單引號或雙引號。
模型訓練 API 說明
模型訓練 API 的使用方法如下:
繼承
JupiterKerasModel
后,通過定義build
方法自定義模型。build
函數接收一個input_shape
參數作為模型輸入層的shape
,以輸出一個keras.Model
實例。提供以下信息,完成實例化自定義模型:
uid:模型 ID。
build_method
支持以下三種輸入:from_server
要求所有 Client 端從 Server 端獲取并加載已編譯好的模型,從而使所有參與方的初始狀態保持一致。
from_local
使用本地訓練后的模型,要求
file_uri
參數指定的路徑可以獲取以checkpoint
文件夾形式存在的模型。None
使用
build
方法創建模型,并且不進行同步操作。
file_uri:模型保存路徑。
input_shape:輸入形式。
build_method:構建方法。
編譯模型。此處接受的參數類似
keras
,但新增了一個strategy
參數,該參數接受一個fascia.strategy.BaseKerasStrategy
的子類,或者是預定義的字符串,目前支持以下兩種策略:fedavg-w
fedavg-grad
訓練模型。關于此處接受的參數及類型,請參見本節 參數 中
model.fit
參數說明。使用
model.save()
保存模型,該方法接受 saved_path 參數作為保存路徑。當不指定該參數時,保存路徑由實例化模型時輸入的file_uri
參數決定。
模型訓練代碼示例
from typing import Union, Tuple, Dict
import tensorflow as tf
from tensorflow import keras
from tensorflow.python.keras import Model
from fascia.biz.model import JupiterKerasModel
from fascia.biz.summary import summary
from fascia.biz.api.dataframe import read_fed_table
roche = read_fed_table("$df0").values()
train_x, train_y = roche[:, 1:], roche[:, 0]
summary.schema(train_x)
summary.schema(train_y)
class CustomKerasModel(JupiterKerasModel):
def build(self, input_shape) -> Union[Model, Tuple[Model, Dict]]:
model = tf.keras.Sequential(
[
tf.keras.layers.Dense(64, activation="relu", input_shape=(72,)),
tf.keras.layers.Dense(32, activation="relu"),
tf.keras.layers.Dense(1, activation='sigmoid'),
]
)
return model
model = CustomKerasModel(uid='roche_fedavg', file_uri="$model", input_shape=(72,))
# Compile model with FedAVG strategy (weight aggregation)
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),
loss=tf.keras.losses.BinaryCrossentropy(),
metrics=[tf.metrics.BinaryAccuracy(),
tf.keras.metrics.AUC(),
tf.keras.metrics.Precision(),
tf.keras.metrics.Recall()],
strategy='fedavg-w') #tf.metrics.BinaryAccuracy(threshold=0.5),
# Fit model
model.fit(train_x, train_y, batch_size=256, epochs=10, validation_split=0.1, aggregate_freq=1)
model.save()
參數
train_x:特征,接受
FedNdArray
或者"$df0"
形式的占位符。train_y:標簽,接受
FedNdArray
或者"$df0"
形式的占位符。batch_size:批處理大小,接受整數或類似
{'party_a': 32, 'party_b': 64}
格式的字段,注意該設置也會影響驗證集。epochs:訓練回合數。
verbose:是否在過程中顯示性能指標。
callbacks:類似
Keras.Callback
。validation_split:驗證集的切分比例。
validation_data:驗證集數據,當提供該數據集時,
validation_split
會被忽略。validation_freq:驗證頻率。
shuffle:是否對數據進行
shuffle
。sample_weight:
sample
權值,含義類似keras
。steps_per_epoch:每個
epoch
中執行的步數,當提供該參數時,batch_size
參數會被忽略。aggregate_freq:聚合頻率。
trainable_parties:指定使用訓練的 parties。指定為類似
['party_a', 'party_b']
時,表示使用指定的參與方參與聚合。默認為 None,即表示使用所有的 parties。
返回值定義
history:訓練結果的歷史記錄,包括全局聚合的性能指標、本地訓練集性能指標和驗證集性能指標。
History 結果示例
{
"alice": {"loss": [0.14, 0.12], "accuracy": [0.85, 0.87]},
"bob": {"loss": [0.14, 0.12], "accuracy": [0.85, 0.87]},
"__global__": {"loss": [0.14, 0.12], "accuracy": [0.85, 0.87]},
}