一、项目简介
FATE联邦学习实现基于卷积神经网络的手写字体Mnist识别算法。实验环境:FATE V1.8 StandAlone、CentOS 7、FinalShell。
关于卷积神经网络的手写字体识别算法的基本原理,可参考李沐老师的《动手学深度学习》一书,本文注重利用FATE平台实现基于卷积神经网络的手写字体Mnist识别算法的实践,因此对于理论部分不做过多介绍。
二、方案一:使用csv数据进行手写字体识别训练
1.数据下载
mnist数据集的csv文件下载链接:MNIST in CSV (kaggle.com)
2.切分与上传数据
2.1 切分数据
2.1.1 切分训练数据
Mnist共计60000条数据,这里将其切分成两等份,host与guest各30000条。切分代码如下:
import pandas as pd
# 读取整个 CSV 训练文件
df = pd.read_csv('../mnist_train.csv')
# 切分训练数据集
host_train = df.iloc[:30000]
guest_train = df.iloc[30000:60000]
# 输出切分后的 CSV 训练文件
host_train.to_csv('host_train.csv', index=True, encoding='utf-8')
guest_train.to_csv('guest_train.csv', index=True, encoding='utf-8')
2.2.2切分测试数据
Mnist共计10000条数据,这里按照测试数据占训练数据10%的比例,取6000条作为测试数据。切分代码如下:
# 读取整个 CSV 测试文件
df_test = pd.read_csv('../mnist_test.csv')
# 切分测试数据集
host_test = df_test.iloc[:3000]
guest_train = df_test.iloc[3000:6000]
# 输出切分后的 CSV 测试文件
host_test.to_csv('host_test.csv', index=True, encoding='utf-8')
guest_train.to_csv('guest_test.csv', index=True, encoding='utf-8')
2.2 host方上传训练与测试数据配置文件——upload_data_host_train_conf.json、upload_data_host_test_conf.json
//训练数据
{
//路径位置
"file": "",
//是否包含表头
"head": 1,
// 分区数
"partition": 8,
// 工作模式 0——单机版 1——集群版
"work_mode": 0,
// DTable_Name
"table_name": "minist_host_train",
// DTable_NameSpace
"namespace": "ex_minist_host_train" // DTable格式的表名对应的命名空间
}
//训练数据
{
"file": "/root/MyData/TempData/host_train.csv", "table_name": "minist_host_train",
"namespace": "ex_minist_host_train",
"head": 1,
"partition": 8
}
//测试数据
{
"file": "/root/MyData/TempData/host_test.csv",
"table_name": "minist_host_test",
"namespace": "ex_minist_host_test",
"head": 1,
"partition": 8
}
2.3 guest方上传数据配置文件——upload_data_guest_train_conf.json、upload_data_guest_test_conf.json
// 训练数据
{
"file": "/root/MyData/TempData/guest_train.csv",
"table_name": "minist_guest_train",
"namespace": "ex_minist_guest_train",
"head": 1,
"partition": 8
}
//测试数据
{
"file": "/root/MyData/TempData/guest_test.csv",
"table_name": "minist_guest_test",
"namespace": "ex_minist_guest_test",
"head": 1,
"partition": 8
}
2.4 上传数据shell脚本——通过fate_flow_client.py进行上传
# 上传host训练数据
python /root/standalone_fate_install_1.8.0/fateflow/python/fate_flow/fate_flow_client.py -f upload -c /root/MyCode/upload/upload_data_host_train_conf.json
# 上传host测试数据
python /root/standalone_fate_install_1.8.0/fateflow/python/fate_flow/fate_flow_client.py -f upload -c /root/MyCode/upload/upload_data_host_test_conf.json
# 上传guest训练数据
python /root/standalone_fate_install_1.8.0/fateflow/python/fate_flow/fate_flow_client.py -f upload -c /root/MyCode/upload/upload_data_guest_train_conf.json
# 上传guest测试数据
python /root/standalone_fate_install_1.8.0/fateflow/python/fate_flow/fate_flow_client.py -f upload -c /root/MyCode/upload/upload_data_guest_test_conf.json
3. 查看并修改fate自带的卷积神经网络
1.路径及文件名如下
2.仔细分析一下官方例程
{
// 初始化dsl版本号
"dsl_version": 2,
"initiator": {
"role": "guest",
"party_id": 9999
},
// 参与方
"role": {
"arbiter": [
10000
],
"host": [
10000,
9999
],
"guest": [
9999
]
},
"component_parameters": {
// common —— 共享参数,所有角色都适用
"common": {
"homo_nn_0": {
"api_version": 2,