|
|
import flwr as fl |
|
|
import tensorflow as tf |
|
|
import numpy as np |
|
|
import pandas as pd |
|
|
from model import create_model |
|
|
|
|
|
def load_data(file_path, client_id): |
|
|
data = pd.read_csv(file_path) |
|
|
|
|
|
X = data.iloc[:, :-1].values |
|
|
y = data.iloc[:, -1].values |
|
|
X = (X - X.mean(axis=0)) / (X.std(axis=0) + 1e-8) |
|
|
split = int(len(X) * 0.8) |
|
|
X_train, X_test = X[:split], X[split:] |
|
|
y_train, y_test = y[:split], y[split:] |
|
|
size = len(X_train) // 2 |
|
|
return ( |
|
|
X_train[client_id * size:(client_id + 1) * size], |
|
|
y_train[client_id * size:(client_id + 1) * size], |
|
|
X_test, |
|
|
y_test |
|
|
) |
|
|
|
|
|
class HospitalClient(fl.client.NumPyClient): |
|
|
|
|
|
def __init__(self, client_id, file_path): |
|
|
self.x_train, self.y_train, self.x_test, self.y_test = load_data(file_path, client_id) |
|
|
self.model = create_model(input_shape=self.x_train.shape[1]) |
|
|
|
|
|
def get_parameters(self, config): |
|
|
return self.model.get_weights() |
|
|
|
|
|
def fit(self, parameters, config): |
|
|
self.model.set_weights(parameters) |
|
|
self.model.fit(self.x_train, self.y_train, epochs=5, verbose=0) |
|
|
return self.model.get_weights(), len(self.x_train), {} |
|
|
|
|
|
def evaluate(self, parameters, config): |
|
|
self.model.set_weights(parameters) |
|
|
loss, accuracy = self.model.evaluate(self.x_test, self.y_test, verbose=0) |
|
|
return loss, len(self.x_test), {"accuracy": accuracy} |
|
|
|
|
|
if __name__ == "__main__": |
|
|
import sys |
|
|
client_id = int(sys.argv[1]) if len(sys.argv) > 1 else 0 |
|
|
file_path = sys.argv[2] if len(sys.argv) > 2 else "diabetes.csv" |
|
|
fl.client.start_numpy_client( |
|
|
server_address="localhost:8080", |
|
|
client=HospitalClient(client_id, file_path) |
|
|
) |