十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

联邦学习实战:构建隐私保护的学生成绩预测系统

联邦学习实战:构建隐私保护的学生成绩预测系统 简介本资源是一套面向高校计算机类专业本科生与研究生的联邦学习实践项目聚焦学生成绩预测这一典型教育数据建模场景融合深度学习与隐私保护技术适用于毕业设计、课程综合实践及科研入门。压缩包共67个文件含18个核心Python源码涵盖FedProx、Scaffold、Ditto、MTL等主流联邦算法实现、7个CSV格式真实/模拟学生成绩数据集、28个已编译pyc文件用于快速验证以及README说明文档和Streamlit可视化界面代码整体仅2.26MB轻量易部署。已有75人下载学习项目经完整调试与答辩验证获95分高分评价。用户可直接运行本地训练模块main_local.py、多客户端联邦训练脚本main_fedrep.py等并借助Streamlit平台实时查看模型精度、损失曲线与混淆矩阵等可视化结果代码结构清晰、模块解耦良好便于理解联邦通信协议、本地更新策略及跨设备协同机制具备扎实的教学示范性与二次开发基础。1. 项目缘起为什么用联邦学习做成绩预测在高校或大型教育机构里数据部门或者教学分析团队经常会遇到一个经典难题我们想利用各个院系、各个班级的历史学生数据比如出勤率、作业分数、期中成绩、在线学习平台活跃度等来构建一个预测模型用于提前预警学业困难的学生或者优化教学资源的分配。这个想法听起来很美好但一落地就撞上了数据隐私和孤岛这两堵高墙。历史数据往往分散在各个学院甚至各个授课教师的本地数据库或Excel表格里。出于对数据隐私、管理权限甚至是一些“数据资产”观念的考量这些数据的所有者通常不愿意、或者制度上不允许将原始数据集中汇总到一个中心服务器。这就是典型的数据孤岛问题。你可能会说那我们用传统的数据仓库或者数据湖方案把数据都ETL过来不就行了但在涉及学生个人敏感信息的场景下这种中心化的数据汇集方式面临着巨大的合规风险如GDPR、国内的《个人信息保护法》和实际操作阻力。这时候联邦学习Federated Learning的技术思路就非常对路了。它的核心思想不是“移动数据”而是“移动模型”。我们不需要把各处的原始学生数据收集到一起而是让一个初始的预测模型“出差”分别到各个数据持有方比如数学系、计算机系的本地环境中进行训练。每个参与方用自己的数据训练模型得到模型参数的更新例如梯度信息然后将这些加密的、脱敏的参数更新上传到一个中央协调服务器。服务器聚合来自各方的参数更新融合成一个更强大的全局模型再下发给各方。如此迭代最终得到一个性能优异的预测模型而各方的原始数据自始至终都留在本地没有泄露。这个项目的目标就是动手实现这样一个基于联邦学习框架的学生成绩预测系统并用Streamlit快速搭建一个交互式可视化平台让非技术背景的教学管理者也能直观地看到预测结果、模型效果和各参与方的贡献。这不仅仅是一个技术Demo它为我们提供了一套在隐私保护前提下进行跨部门协同数据挖掘的可行技术方案。2. 系统核心架构与联邦学习流程设计要实现这个系统我们需要设计一个清晰的架构它主要包含两个部分联邦学习训练后端和Streamlit可视化前端。两者通过模型文件或API进行交互。2.1 联邦学习训练流程拆解我们采用经典的横向联邦学习架构假设各参与方各院系的数据特征空间如科目、行为指标是相同的但样本学生不同。整个训练流程是一个多轮迭代的过程中央服务器初始化中央服务器初始化一个全局预测模型比如一个简单的多层感知机MLP或梯度提升树如LightGBM。在联邦学习场景下更常用的是能够方便计算和传输梯度的神经网络模型。客户端选择与分发在每一轮训练开始时服务器从所有注册的客户端院系中随机选择一部分参与本轮训练并将当前的全局模型参数下发给它们。本地客户端训练每个被选中的客户端在本地用自己的数据对收到的全局模型进行若干轮Epoch的训练。这里的关键是原始数据不出本地。训练完成后客户端计算模型参数的更新量通常是梯度或者是训练后的新参数与旧参数的差值。安全聚合各客户端将加密后的参数更新发送回中央服务器。为了进一步增强隐私可以采用差分隐私技术向更新中添加噪声或使用安全多方计算、同态加密对更新进行加密后再聚合。在我们的教学演示项目中可以暂缓实现复杂的加密但必须在架构上留出接口并明确告知这是生产环境必需的步骤。全局模型更新服务器接收到所有参与方的更新后进行聚合。最常用的聚合算法是FedAvg联邦平均。简单来说就是根据各客户端本地数据量的大小对它们上传的参数更新进行加权平均然后用这个平均后的更新来刷新全局模型。重复迭代将更新后的全局模型作为下一轮的起点重复步骤2-5直到模型性能收敛或达到预设的训练轮数。这个流程确保了数据隐私同时通过聚合多方知识提升了模型性能。一个常见的误区是认为联邦学习的模型效果一定比中心化训练差。实际上在数据分布相对均衡即各院系学生成绩的影响因素类似的情况下通过足够轮数的迭代联邦学习模型的性能可以非常接近中心化训练的模型。2.2 技术栈选型与理由联邦学习框架我们选择PySyft或Flower。PySyft 概念清晰与PyTorch/TensorFlow深度集成适合理解底层原理。Flower 则更工程化客户端和服务端解耦更好支持大规模跨语言部署。本项目为求简洁和快速演示选用Flower因为它配置相对简单且自带丰富的示例。机器学习框架选择PyTorch。因其动态图特性在研究和原型开发中非常灵活且与联邦学习的梯度传输概念结合直观。模型我们构建一个简单的全连接神经网络。可视化与交互平台Streamlit是不二之选。它允许我们完全用Python脚本快速创建美观的Web应用无需前端知识。我们可以轻松地将训练过程、结果评估、预测查询等功能封装成交互组件。数据与模拟由于真实数据敏感我们将使用公开数据集如sklearn的合成数据集或根据教育数据特征模拟生成多个客户端的数据。关键是要模拟出“非独立同分布”的数据特点即不同客户端的数据分布有差异比如“文科学院”和“理科学院”的学生成绩分布模式不同这才是联邦学习要解决的真实挑战。3. 关键代码实现从数据模拟到联邦训练接下来我们深入到代码层面看看如何将上述架构落地。3.1 模拟非独立同分布客户端数据数据是联邦学习的基础。我们不能简单地将一份数据随机切分给多个客户端那样就变成了分布式训练没有模拟出数据孤岛的本质。我们需要让每个客户端的数据有独特的分布。import numpy as np import torch from torch.utils.data import Dataset, DataLoader from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split def create_client_data(client_id, num_clients, total_samples1000, features10, seed42): 为指定客户端生成模拟数据。 通过改变随机种子和数据生成参数使不同客户端的数据分布不同。 np.random.seed(seed client_id) # 每个客户端有不同的种子 # 为不同客户端设置不同的类别分离度或特征权重模拟数据分布差异 class_sep 0.5 (client_id * 0.2) # 分离度随client_id增加 X, y make_classification(n_samplestotal_samples // num_clients, n_featuresfeatures, n_informative8, n_redundant2, n_clusters_per_class1, class_sepclass_sep, random_stateseedclient_id) # 将数据转换为PyTorch Tensor X_tensor torch.FloatTensor(X) y_tensor torch.LongTensor(y) return X_tensor, y_tensor class ClientDataset(Dataset): 自定义数据集类包装客户端数据 def __init__(self, features, labels): self.features features self.labels labels def __len__(self): return len(self.labels) def __getitem__(self, idx): return self.features[idx], self.labels[idx]通过调整class_sep等参数我们让客户端0的数据线性可分性强一些客户端1的弱一些以此类推从而模拟真实世界中不同数据源的质量和分布差异。3.2 定义神经网络模型我们构建一个简单的多层感知机用于二分类预测成绩是否及格或回归预测具体分数。import torch.nn as nn import torch.nn.functional as F class GradePredictor(nn.Module): def __init__(self, input_dim10, hidden_dim64, output_dim2): super(GradePredictor, self).__init__() self.fc1 nn.Linear(input_dim, hidden_dim) self.fc2 nn.Linear(hidden_dim, hidden_dim // 2) self.fc3 nn.Linear(hidden_dim // 2, output_dim) self.dropout nn.Dropout(0.3) # 防止过拟合 def forward(self, x): x F.relu(self.fc1(x)) x self.dropout(x) x F.relu(self.fc2(x)) x self.dropout(x) x self.fc3(x) # 对于分类任务最后接CrossEntropyLoss这里不包含softmax return x注意模型结构不宜过于复杂。在联邦学习中复杂的模型意味着更大的参数量会增加通信开销。同时在数据量有限的客户端上复杂模型也更容易过拟合。3.3 实现Flower客户端与服务端这是联邦学习的核心。我们需要定义客户端如何本地训练服务端如何聚合。客户端代码 (client.py):import flwr as fl import torch from torch.utils.data import DataLoader class FlowerClient(fl.client.NumPyClient): def __init__(self, cid, trainloader, valloader, device): self.cid cid self.trainloader trainloader self.valloader valloader self.device device # 初始化本地模型 self.model GradePredictor().to(device) self.criterion torch.nn.CrossEntropyLoss() self.optimizer torch.optim.Adam(self.model.parameters(), lr0.01) def get_parameters(self, config): # 返回模型参数NumPy数组 return [val.cpu().numpy() for val in self.model.state_dict().values()] def set_parameters(self, parameters): # 用服务器下发的参数更新本地模型 params_dict zip(self.model.state_dict().keys(), parameters) state_dict {k: torch.tensor(v) for k, v in params_dict} self.model.load_state_dict(state_dict, strictTrue) def fit(self, parameters, config): # 1. 用服务器参数更新本地模型 self.set_parameters(parameters) # 2. 本地训练 self.model.train() for epoch in range(config.get(local_epochs, 2)): # 本地训练轮数 for data, target in self.trainloader: data, target data.to(self.device), target.to(self.device) self.optimizer.zero_grad() output self.model(data) loss self.criterion(output, target) loss.backward() self.optimizer.step() # 3. 返回更新后的参数、数据量等信息 return self.get_parameters(config{}), len(self.trainloader.dataset), {} def evaluate(self, parameters, config): # 评估本地模型性能 self.set_parameters(parameters) self.model.eval() loss, correct 0.0, 0 with torch.no_grad(): for data, target in self.valloader: data, target data.to(self.device), target.to(self.device) output self.model(data) loss self.criterion(output, target).item() pred output.argmax(dim1) correct (pred target).sum().item() accuracy correct / len(self.valloader.dataset) return loss, len(self.valloader.dataset), {accuracy: accuracy}服务端代码 (server.py):import flwr as fl from typing import List, Tuple, Optional, Dict import numpy as np def weighted_average(metrics: List[Tuple[int, Dict]]) - Dict: # 自定义聚合指标如准确率的函数按样本量加权平均 accuracies [num_examples * m[accuracy] for num_examples, m in metrics] examples [num_examples for num_examples, _ in metrics] return {accuracy: sum(accuracies) / sum(examples)} # 定义评估策略 strategy fl.server.strategy.FedAvg( fraction_fit0.5, # 每轮选择50%的客户端参与训练 fraction_evaluate0.5, # 每轮选择50%的客户端参与评估 min_fit_clients2, # 最少需要2个客户端训练 min_evaluate_clients2, min_available_clients3, # 最少有3个客户端在线才启动一轮 evaluate_metrics_aggregation_fnweighted_average, # 使用加权平均聚合准确率 ) # 启动服务器 fl.server.start_server( server_address0.0.0.0:8080, configfl.server.ServerConfig(num_rounds10), # 训练10轮 strategystrategy, )3.4 整合训练与模型保存我们需要编写一个主协调脚本来启动服务器和多个客户端进程模拟。在实际部署中客户端代码会运行在各数据方的机器上。# orchestrator.py import subprocess import time import threading def start_server(): subprocess.run([python, server.py]) def start_client(client_id): # 这里假设每个客户端脚本能接收client_id作为参数来加载对应数据 subprocess.run([python, client.py, --cid, str(client_id)]) if __name__ __main__: # 启动服务器线程 server_thread threading.Thread(targetstart_server) server_thread.start() time.sleep(5) # 等待服务器启动 # 启动3个客户端线程 client_threads [] for i in range(3): t threading.Thread(targetstart_client, args(i,)) t.start() client_threads.append(t) time.sleep(1) for t in client_threads: t.join() server_thread.join()训练结束后全局模型的最佳参数会保存在服务器端。我们需要将其保存为PyTorch模型文件.pth供Streamlit应用加载。4. Streamlit可视化平台搭建实战训练出一个模型只是第一步让业务方教学主任、辅导员能用、爱用才是关键。Streamlit让我们能快速构建一个无需复杂部署的演示平台。4.1 应用核心页面布局与功能设计我们的Streamlit应用主要包含以下几个页面或部分概览仪表盘展示联邦学习的整体训练过程曲线如全局准确率随训练轮次的变化、各客户端的参与情况和最终贡献度。模型评估使用一个保留的测试集可以是模拟的全局测试集评估最终全局模型的性能展示混淆矩阵、ROC曲线、特征重要性如果使用树模型等。成绩预测查询提供一个表单让用户输入某个学生的各项特征如作业平均分、出勤率、前期测验成绩等系统调用训练好的联邦学习模型进行预测返回是否可能挂科的概率或预测分数段。联邦过程模拟一个简单的动画或分步图示展示“参数下发-本地训练-上传更新-聚合”的过程用于教学和演示。4.2 关键Streamlit组件与代码示例主应用文件 (app.py):import streamlit as st import pandas as pd import numpy as np import plotly.graph_objects as go import plotly.express as px import torch from model import GradePredictor # 导入之前定义的模型结构 # 设置页面 st.set_page_config(page_title联邦学习成绩预测平台, layoutwide) st.title( 联邦学习驱动的学生成绩预测系统) # 侧边栏导航 page st.sidebar.selectbox(导航, [ 系统概览, 训练过程可视化, 模型性能评估, 单点成绩预测, 联邦过程模拟]) # 加载训练好的全局模型 st.cache_resource def load_global_model(model_pathglobal_model.pth): model GradePredictor() try: model.load_state_dict(torch.load(model_path, map_locationcpu)) model.eval() return model except FileNotFoundError: st.error(f未找到模型文件 {model_path}请先运行联邦学习训练。) return None global_model load_global_model() # 1. 系统概览页 if page 系统概览: st.header(系统概述) col1, col2, col3 st.columns(3) with col1: st.metric(参与客户端数, 3个, 模拟文/理/工学院) with col2: st.metric(联邦训练轮次, 10轮, 已收敛) with col3: st.metric(全局模型准确率, 86.5%, 2.1% vs 单客户端平均) st.markdown(---) st.subheader(核心价值) st.markdown( * **数据隐私保护**各院系原始数据无需离开本地符合隐私法规要求。 * **打破数据孤岛**在不出域的前提下联合多方数据训练出更强大的预测模型。 * **公平贡献评估**系统可追踪各客户端对全局模型的贡献度。 * **易用可视化**为教学管理者提供直观的决策支持界面。 ) # 2. 训练过程可视化页 elif page 训练过程可视化: st.header(联邦训练过程监控) # 假设我们从日志中读取了每轮的评估结果 # 这里用模拟数据 rounds list(range(1, 11)) global_acc [0.65, 0.72, 0.78, 0.81, 0.83, 0.85, 0.86, 0.865, 0.865, 0.865] client_acc { 文学院: [0.70, 0.74, 0.77, 0.79, 0.80, 0.81, 0.82, 0.825, 0.825, 0.825], 理学院: [0.68, 0.75, 0.79, 0.82, 0.84, 0.85, 0.855, 0.86, 0.86, 0.86], 工学院: [0.62, 0.70, 0.76, 0.80, 0.82, 0.84, 0.85, 0.85, 0.85, 0.85] } fig go.Figure() fig.add_trace(go.Scatter(xrounds, yglobal_acc, modelinesmarkers, name全局模型, linedict(width4))) for client, acc in client_acc.items(): fig.add_trace(go.Scatter(xrounds, yacc, modelines, namef{client}本地模型, linedict(dashdash))) fig.update_layout(title全局与本地模型准确率随训练轮次变化, xaxis_title训练轮次, yaxis_title准确率, hovermodex unified) st.plotly_chart(fig, use_container_widthTrue) st.caption(观察随着联邦训练轮次增加全局模型准确率稳步提升并超越任一单一本地模型体现了联邦学习的协同价值。) # 3. 模型性能评估页 elif page 模型性能评估: st.header(最终模型性能分析) if global_model is not None: # 加载测试数据 # test_features, test_labels load_test_data() # ... 这里进行模型评估计算指标 ... # 模拟评估结果 col1, col2 st.columns(2) with col1: st.subheader(分类报告 (模拟)) report_df pd.DataFrame({ Precision: [0.85, 0.88], Recall: [0.82, 0.90], F1-Score: [0.83, 0.89] }, index[不及格, 及格]) st.dataframe(report_df.style.format({:.2%})) with col2: st.subheader(混淆矩阵热图 (模拟)) conf_matrix np.array([[82, 18], [10, 90]]) # 模拟数据 fig px.imshow(conf_matrix, text_autoTrue, labelsdict(x预测标签, y真实标签, color样本数), x[不及格, 及格], y[不及格, 及格], color_continuous_scaleBlues) st.plotly_chart(fig, use_container_widthTrue) st.markdown(**模型解读**该模型在预测‘及格’类别上表现更优召回率达90%。对于‘不及格’的预测精确度较高但召回率有提升空间意味着系统倾向于更谨慎地标记潜在风险学生避免误报。) # 4. 单点成绩预测页 elif page 单点成绩预测: st.header(学生成绩预测查询) st.markdown(请输入该学生的相关特征信息模拟数据特征已做标准化处理) with st.form(prediction_form): col1, col2 st.columns(2) with col1: feature1 st.slider(作业平均分 (标准化), -2.0, 2.0, 0.0, 0.1) feature2 st.slider(出勤率 (标准化), -2.0, 2.0, 0.0, 0.1) feature3 st.slider(期中测验成绩 (标准化), -2.0, 2.0, 0.0, 0.1) with col2: feature4 st.slider(在线学习活跃度 (标准化), -2.0, 2.0, 0.0, 0.1) feature5 st.slider(前期知识摸底成绩 (标准化), -2.0, 2.0, 0.0, 0.1) submitted st.form_submit_button(进行预测) if submitted and global_model is not None: input_features torch.tensor([[feature1, feature2, feature3, feature4, feature5]], dtypetorch.float32) with torch.no_grad(): output global_model(input_features) probabilities torch.softmax(output, dim1) # 获取概率 pred_class torch.argmax(probabilities, dim1).item() prob_fail probabilities[0][0].item() * 100 prob_pass probabilities[0][1].item() * 100 st.subheader(预测结果) result_col1, result_col2 st.columns(2) with result_col1: if pred_class 1: st.success(f✅ 预测结果**及格**) else: st.error(f⚠️ 预测结果**有不及格风险**) with result_col2: st.metric(不及格概率, f{prob_fail:.1f}%) st.metric(及格概率, f{prob_pass:.1f}%) # 可视化概率 fig go.Figure(data[ go.Bar(name概率, x[不及格风险, 及格], y[prob_fail, prob_pass], marker_color[#EF553B, #00CC96]) ]) fig.update_layout(title预测概率分布, yaxis_title概率 (%)) st.plotly_chart(fig, use_container_widthTrue) # 5. 联邦过程模拟页 elif page 联邦过程模拟: st.header(联邦学习流程动态模拟) round_slider st.slider(选择训练轮次, 1, 10, 1) st.markdown(f### 第 {round_slider} 轮训练过程) # 使用容器和动画模拟流程 col_server, col_network, col_clients st.columns([1, 1, 3]) with col_server: st.markdown(**中央服务器**) st.info(聚合参数) st.metric(全局模型版本, fV{round_slider}) with col_network: st.markdown(**网络通信**) if round_slider 1: st.caption(初始化...) else: st.success(⬇ 下发参数) st.success(⬆ 上传更新) with col_clients: st.markdown(**客户端 (本地训练)**) client_cols st.columns(3) client_names [文学院, 理学院, 工学院] for idx, ccol in enumerate(client_cols): with ccol: st.markdown(f**{client_names[idx]}**) # 模拟本地数据量和准确率变化 local_acc 0.65 (idx * 0.05) (round_slider * 0.02) st.metric(本地准确率, f{local_acc:.1%}, f{0.02*100:.1f}%) st.progress(min(int((local_acc-0.65)/0.3*100), 100)) # 模拟进度 st.markdown(---) st.caption(模拟说明每一轮服务器将全局模型参数下发给选中的客户端。客户端在本地数据上训练计算参数更新并加密上传。服务器安全聚合所有更新形成新一代全局模型。)5. 部署、优化与踩坑实录将代码跑通只是第一步要让这个系统真正可用还需要考虑部署、性能优化和解决实际运行中的问题。5.1 本地与简易云部署方案本地运行这是最简单的。在单机上用多个终端或进程模拟多个客户端和服务器。使用streamlit run app.py启动可视化界面。适合演示和开发调试。Docker容器化这是走向生产环境的重要一步。为服务器、客户端和Streamlit应用分别编写Dockerfile。优势环境隔离依赖固定易于在云服务器或Kubernetes集群上部署。关键点需要配置容器间的网络通信确保服务器和客户端容器能通过主机名和端口互相访问。云服务器部署可以租用一台云服务器运行中央服务器和Streamlit应用各数据持有方客户端在各自的内部服务器上运行客户端程序通过公网需配置安全组和SSL或专线与中央服务器通信。务必注意网络安全和通信加密。5.2 性能与隐私优化考量通信压缩模型参数可能很大。可以使用梯度压缩、量化或稀疏化技术减少通信数据量。Flower框架支持一些内置的策略。客户端差异容忍真实环境中客户端设备可能异构算力不同、数据量差异大。需要设计策略如让数据量大的客户端训练更多轮次或对更新进行加权时更充分考虑数据量。隐私增强技术集成差分隐私在客户端上传参数更新前加入符合差分隐私定义的噪声。可以使用Opacus或TensorFlow Privacy库。这会引入噪声需要在隐私预算和模型效用间权衡。安全聚合使用加密技术使得服务器只能看到聚合后的结果而无法知晓单个客户端的更新。这需要更复杂的密码学原语支持。模型个性化训练出的全局模型可能对某些数据分布特殊的客户端表现不佳。可以在联邦学习后让各客户端在全局模型基础上进行少量本地微调得到个性化的模型这被称为联邦迁移学习或个性化联邦学习。5.3 实际开发中遇到的“坑”与解决方案坑1客户端数据分布极度不均衡导致模型发散或偏向现象一个客户端数据量极大或数据质量极高其本地更新主导了全局模型导致模型在其他客户端上表现很差。解决采用加权联邦平均时谨慎设计权重。除了按数据量加权还可以考虑按客户端历史表现如上一轮评估的损失动态调整权重或使用FedProx等算法在本地目标函数中加入一个正则项限制本地更新不要偏离全局模型太远。坑2网络不稳定导致训练轮次失败现象某些客户端频繁掉线导致每轮参与训练的客户端集合不稳定训练过程震荡。解决服务器端策略如FedAvg需要设置合理的min_available_clients和min_fit_clients。对于常掉线的客户端可以设计容错机制如将其标记为“不活跃”仅在有更新时才参与聚合或使用异步联邦学习算法。坑3Streamlit应用加载大模型慢现象每次刷新页面或交互都要重新加载模型体验卡顿。解决使用st.cache_resource装饰器缓存模型对象。确保模型加载只发生一次。对于非常大的模型可以考虑使用torch.jit.script进行脚本化优化或转换为ONNX格式以提高加载和推理速度。坑4模拟数据与真实场景差距现象在模拟的IID独立同分布或简单Non-IID数据上效果很好但换到真实数据一塌糊涂。解决在数据模拟阶段尽可能调研真实教育数据的特征。例如成绩分布可能不是正态的而是有偏的不同特征之间存在复杂的相关性。可以使用Copula等方法生成更符合真实联合分布的数据。同时在模型评估时必须使用一个独立的、从未参与任何客户端训练的测试集。这个项目从技术上看是联邦学习、机器学习和Web可视化的一次有趣结合从应用上看它为教育数据挖掘提供了一种隐私优先的新范式。实现过程中最深的体会是联邦学习不仅仅是一个算法更是一套包含通信、安全、协调的系统工程思维。通过Streamlit将这个过程可视化极大地降低了向领域专家解释和展示其价值的门槛。未来可以在此基础上探索更复杂的模型如处理时序行为的LSTM、更严格的隐私保护方案甚至尝试将其部署到真实的、物理隔离的多校区环境中进行试点。本文还有配套的精品资源点击获取
返回列表