联邦学习框架flower案例——Quickstart TensorFlow

本文演示了如何使用TensorFlow的KerasAPI和Flower框架,在20行代码内建立一个简单的联邦学习系统。首先介绍了安装Flower和TensorFlow的步骤,然后加载CIFAR10数据集,使用MobilNetV2模型进行训练。接着,实现了Flower的客户端接口NumPyClient,最后启动服务器和多个客户端进行分布式训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

翻译自Quickstart TensorFlow - Flower 1.5.0

Quickstart TensorFlow

用不到20行的代码构建一个联邦学习系统

在import Flower框架前,需要先安装它:

$ pip install flwr

因为我们想使用TensorFlow (TF)的Keras API,我们也必须安装TF:

$ pip install tensorflow

Flower Client

接下来,在名为client.py的文件中,导入Flower和TensorFlow

import flwr as fl
import tensorflow as tf

我们使用TF的Keras实用程序来加载CIFAR10,这是一个流行的用于机器学习的彩色图像分类数据集。调用tf.keras.datasets.cifar10.load_data()来下载CIFAR10,在本地缓存它,然后将整个训练集和测试集作为NumPy数组返回。

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

接下来,我们需要一个模型。为了本教程的目的,我们使用带有10个输出类的MobilNetV2

model = tf.keras.applications.MobileNetV2((32, 32, 3), classes=10, weights=None)
model.compile("adam", "sparse_categorical_crossentropy", metrics=["accuracy"])

Flower server通过一个名为Client的接口与client交互。当server选择一个特定的client端进行训练时,它会通过网络发送训练指令。client接收这些指令并调用client方法之一来运行你的代码(即,训练我们之前定义的神经网络)。

Flower提供了一个名为NumPyClient的方便类,当您的工作负载使用Keras时,它使实现Client接口变得更容易。NumPyClient接口定义了三个方法,可以通过以下方式实现:

class CifarClient(fl.client.NumPyClient):
    def get_parameters(self, config):
        return model.get_weights()

    def fit(self, parameters, config):
        model.set_weights(parameters)
        model.fit(x_train, y_train, epochs=1, batch_size=32, steps_per_epoch=3)
        return model.get_weights(), len(x_train), {}

    def evaluate(self, parameters, config):
        model.set_weights(parameters)
        loss, accuracy = model.evaluate(x_test, y_test)
        return loss, len(x_test), {"accuracy": float(accuracy)}

现在我们可以创建一个类CifarClient的实例,并添加一行来实际运行这个客户端:

fl.client.start_numpy_client(server_address="[::]:8080", client=CifarClient())

对客户端来说就这样了。我们只需要实现Client或NumPyClient并调用fl.client.start_client()或fl.client.start_numpy_client()。字符串“[::]:8080”告诉客户端要连接到哪个服务器。在我们的示例中,我们可以在同一台机器上运行服务器和客户机,因此我们使用“[::]:8080”。如果我们运行一个真正的联邦工作负载,服务器和客户机在不同的机器上运行,那么需要更改的只是我们指向客户机的server_address。

Flower Server

对于简单的工作负载,我们可以启动一个Flower server,并保留所有配置可能性的默认值。在一个名为server.py的文件中,导入Flower并启动server

import flwr as fl

fl.server.start_server(config=fl.server.ServerConfig(num_rounds=3))

Train the model, federated!

客户机和服务器都准备好了,我们现在可以运行所有内容,并看到联邦学习的实际效果。FL系统通常有一个服务器和多个客户端。因此,我们必须首先启动服务器:

$ python server.py

一旦服务器开始运行,我们就可以在不同的终端上启动客户端。打开一个新终端并启动第一个客户端:

$ python client.py

打开另一个终端,启动第二个客户端:

$ python client.py

每个客户端都有自己的数据集。

现在,您应该看到在第一个终端(启动服务器的终端)中训练是如何进行的:

INFO flower 2021-02-25 14:15:46,741 | app.py:76 | Flower server running (insecure, 3 rounds)
INFO flower 2021-02-25 14:15:46,742 | server.py:72 | Getting initial parameters
INFO flower 2021-02-25 14:16:01,770 | server.py:74 | Evaluating initial parameters
INFO flower 2021-02-25 14:16:01,770 | server.py:87 | [TIME] FL starting
DEBUG flower 2021-02-25 14:16:12,341 | server.py:165 | fit_round: strategy sampled 2 clients (out of 2)
DEBUG flower 2021-02-25 14:21:17,235 | server.py:177 | fit_round received 2 results and 0 failures
DEBUG flower 2021-02-25 14:21:17,512 | server.py:139 | evaluate: strategy sampled 2 clients
DEBUG flower 2021-02-25 14:21:29,628 | server.py:149 | evaluate received 2 results and 0 failures
DEBUG flower 2021-02-25 14:21:29,696 | server.py:165 | fit_round: strategy sampled 2 clients (out of 2)
DEBUG flower 2021-02-25 14:25:59,917 | server.py:177 | fit_round received 2 results and 0 failures
DEBUG flower 2021-02-25 14:26:00,227 | server.py:139 | evaluate: strategy sampled 2 clients
DEBUG flower 2021-02-25 14:26:11,457 | server.py:149 | evaluate received 2 results and 0 failures
DEBUG flower 2021-02-25 14:26:11,530 | server.py:165 | fit_round: strategy sampled 2 clients (out of 2)
DEBUG flower 2021-02-25 14:30:43,389 | server.py:177 | fit_round received 2 results and 0 failures
DEBUG flower 2021-02-25 14:30:43,630 | server.py:139 | evaluate: strategy sampled 2 clients
DEBUG flower 2021-02-25 14:30:53,384 | server.py:149 | evaluate received 2 results and 0 failures
INFO flower 2021-02-25 14:30:53,384 | server.py:122 | [TIME] FL finished in 891.6143046000007
INFO flower 2021-02-25 14:30:53,385 | app.py:109 | app_fit: losses_distributed [(1, 2.3196680545806885), (2, 2.3202896118164062), (3, 2.1818180084228516)]
INFO flower 2021-02-25 14:30:53,385 | app.py:110 | app_fit: accuracies_distributed []
INFO flower 2021-02-25 14:30:53,385 | app.py:111 | app_fit: losses_centralized []
INFO flower 2021-02-25 14:30:53,385 | app.py:112 | app_fit: accuracies_centralized []
DEBUG flower 2021-02-25 14:30:53,442 | server.py:139 | evaluate: strategy sampled 2 clients
DEBUG flower 2021-02-25 14:31:02,848 | server.py:149 | evaluate received 2 results and 0 failures
INFO flower 2021-02-25 14:31:02,848 | app.py:121 | app_evaluate: federated loss: 2.1818180084228516
INFO flower 2021-02-25 14:31:02,848 | app.py:125 | app_evaluate: results [('ipv4:127.0.0.1:57158', EvaluateRes(loss=2.1818180084228516, num_examples=10000, accuracy=0.0, metrics={'accuracy': 0.21610000729560852})), ('ipv4:127.0.0.1:57160', EvaluateRes(loss=2.1818180084228516, num_examples=10000, accuracy=0.0, metrics={'accuracy': 0.21610000729560852}))]
INFO flower 2021-02-25 14:31:02,848 | app.py:127 | app_evaluate: failures [] flower 2020-07-15 10:07:56,396 | app.py:77 | app_evaluate: failures []

恭喜你!您已经成功构建并运行了第一个联邦学习系统。完整的源代码可以在github.com中找到。

### TensorFlow 初学者教程 TensorFlow 提供了一系列针对初学者的教程,帮助开发者快速上手深度学习框架。以下是基于官方文档和其他资源整理的内容。 #### 官方入门教程 TensorFlow 官网提供了详细的入门指南,适合新手了解如何构建简单的神经网络模型[^1]。具体来说,可以从以下链接获取完整的入门教程: - [TensorFlow Quickstart for Beginners](https://tensorflow.google.cn/tutorials/quickstart/beginner) 此教程涵盖了以下几个方面: - **环境搭建**:推荐使用 Google Colab,在线环境中已经预装了 TensorFlow 运行库[^2]。 - **数据加载与处理**:通过 MNIST 数据集演示如何准备训练和测试数据。 - **模型定义**:利用 Keras API 构建一个简单的全连接神经网络。 - **损失函数与优化器**:介绍交叉熵作为损失函数以及梯度下降法的应用。 - **评估与预测**:展示如何计算模型精度并对新样本做出分类预测。 #### 示例代码解析 下面是一个典型的 TensorFlow 初学实例,用于解决 MNIST 手写数字识别问题: ```python import tensorflow as tf # 加载MNIST数据集 mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 归一化图像数据到[0, 1]范围 x_train, x_test = x_train / 255.0, x_test / 255.0 # 构建顺序模型 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), # 将二维数组展平为一维向量 tf.keras.layers.Dense(128, activation='relu'), # 隐藏层,激活函数ReLU tf.keras.layers.Dropout(0.2), # Dropout防止过拟合 tf.keras.layers.Dense(10, activation='softmax') # 输出层,Softmax多分类 ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', # 使用稀疏交叉熵损失函数 metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5) # 测试模型性能 test_loss, test_acc = model.evaluate(x_test, y_test) print(f'Test accuracy: {test_acc}') ``` 上述代码展示了如何使用 TensorFlow 和 Keras 创建一个多层感知机(MLP),并通过 Adam 优化算法调整权重来最小化误差。 #### 常见错误提示及其解决方案 对于提到的 `input_data` 错误情况,这是因为较新的版本中移除了对该模块的支持。建议改用内置方法下载并读取 MNIST 数据集合[^3]。另外需要注意的是,不同版本间可能存在接口差异,请确认所依赖的具体版次是否匹配当前开发需求[^4]。 #### 关于 MNIST 数据结构说明 每张图片尺寸均为 \(28 \times 28\) 像素点阵形式呈现灰阶影像资料;经过转换后成为长度等于784的一维特征向量输入至网络之中参与运算过程。而目标输出则由十个独立节点构成的概率分布矢量表示各类别可能性大小关系[^5]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值