【FATE】MNIST手写数字识别——全连接网络

一、环境配置

操作系统:macOS Sierra 10.12.6
docker版本:19.03.8
FATE版本:单机版1.3
python版本:3.6.10
tensorflow:1.15.2
keras版本:2.2.4

二、准备数据

1. 下载数据

本文使用MNIST数据集,MNIST是手写数字识别的数据集。从kaggle下载csv格式的数据集。
FATE训练时需要数据集有id,MNIST数据集里有6w条数据,模拟横向联邦学习,把数据集分为两个各有3w条记录的数据集。

2. 处理数据

首先进入下载到本地的目录,依次输入以下命令:

awk -F'\t' -v OFS=',' ' NR == 1 {print "id",$0; next} {print (NR-1),$0}' mnist_train.csv > mnist_train_with_id.csv

目的:在第一行最前面加上id,第二行开始加序号,并用逗号作为分隔符

sed -i "" "s/label/y/g" mnist_train_with_id.csv

目的:将表头的label替换成y,在FATE里label的名字通常为y。

split -l 30001 mnist_train_with_id.csv mnist_train_3w.csv

目的:将mnist_train_with_id.csv分割,每一个文件有30001行(一行标题和30000行数据)。会生成两个文件:mnist_train_3w.csvaa和mnist_train_3w.csvab

mv mnist_train_3w.csvaa mnist_train_3w_a.csv
mv mnist_train_3w.csvab mnist_train_3w_b.csv
sed -i "" "`cat -n mnist_train_3w_a.csv |head -n 1`" mnist_train_3w_b.csv

目的:将两个文件重命名,并将mnist_train_3w_a.csv文件的第一行(csv的表头)插入mnist_train_3w_b.csv的最前面。这样我们就得到了两个有表头和id的数据集,各有30000条数据

docker cp ${mnist_train_3w_a_path} fate_python: fate/examples/data/
docker cp ${mnist_train_3w_b_path} fate_python: fate/examples/data/

${mnist_train_3w_a_path}:本地保存mnist_train_3w_a.csv的路径
${mnist_train_3w_b_path}:本地保存mnist_train_3w_b.csv的路径
目的:将本地数据拷贝至docker容器(fate_python)中的目录(fate/examples/data/)下

3. 上传数据

(1)上传host方数据

首先进入fate容器:

docker exec -it fate_python bash

下载vim和sudo:

apt-get update
apt-get install vim
apt-get install sudo

新建upload_data_host.json

sudo vi examples/federatedml-1.x-examples/homo_nn/upload_data_host.json

编辑保存退出:

{
    "file": "examples/data/mnist_train_3w_a.csv",
    "head": 1,
    "partition": 10,
    "work_mode": 0,
    "table_name": "homo_mnist_host",
    "namespace": "homo_mnist_host"
}

上传命令:

python fate_flow/fate_flow_client.py -f upload -c examples/federatedml-1.x-examples/homo_nn/upload_data_host.json

(2)上传guest方数据

新建upload_data_guest.json

sudo vi examples/federatedml-1.x-examples/homo_nn/upload_data_guest.json

编辑保存退出:

{
    "file": "examples/data/mnist_train_3w_b.csv",
    "head": 1,
    "partition": 10,
    "work_mode": 0,
    "table_name": "homo_mnist_guest",
    "namespace": "homo_mnist_guest"
}

上传命令:

python fate_flow/fate_flow_client.py -f upload -c examples/federatedml-1.x-examples/homo_nn/upload_data_guest.json

可登录到FateBoard查看上传任务情况

三、编辑运行配置文件

1. 搭建模型

首先进入python解释器:

python

搭建一个keras模型:

import keras
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(512,activation='relu',input_shape=(784,)))
model.add(Dense(256,activation='relu'))
model.add(Dense(10,activation='softmax'))

得到json格式的模型:

json = model.to_json()
print(json)

拷贝输出的一长串 json,退出python解释器:

exit()

2. 修改运行配置文件

进入配置文件,将刚刚输出的json格式的模型拷贝到algorithm_parameters:homo_nn_0:$nn_define位置:

vi examples/federatedml-1.x-examples/homo_nn/test_homo_nn_keras_temperate.json

修改guest方数据集的namenamespace

"name": "homo_mnist_guest",
"namespace": "homo_mnist_guest"

修改host方数据集的namenamespace

"name": "homo_mnist_host",
"namespace": "homo_mnist_host"

修改超参数(可自行调整):

"batch_size": 100,
"optimizer": {
  "optimizer": "Adam",
  "learning_rate": 0.01
},
"early_stop": {
  "early_stop": "diff",
  "eps": 1e-5
},
"loss": "categorical_crossentropy",
"max_iter": 5

四、编辑DSL配置文件

使用自带的DSL配置文件,路径:

fate/examples/federatedml-1.x-examples/homo_nn/test_homo_nn_train_then_predict.json

五、开始训练任务

命令:

python fate_flow/fate_flow_client.py -f submit_job -c examples/federatedml-1.x-examples/homo_nn/test_homo_nn_keras_temperate.json -d examples/federatedml-1.x-examples/homo_nn/test_homo_nn_train_then_predict.json

成功后将得到输出:

{
    "data": {
        "board_url": "http://172.18.0.3:8080/index.html#/dashboard?job_id=202006131204487401867&role=guest&party_id=10000",
        "job_dsl_path": "/fate/jobs/202006131204487401867/job_dsl.json",
        "job_runtime_conf_path": "/fate/jobs/202006131204487401867/job_runtime_conf.json",
        "logs_directory": "/fate/logs/202006131204487401867",
        "model_info": {
            "model_id": "arbiter-10000#guest-10000#host-10000#model",
            "model_version": "202006131204487401867"
        }
    },
    "jobId": "202006131204487401867",
    "retcode": 0,
    "retmsg": "success"
}

可登录到FateBoard查看训练任务情况
FateBoard
通过log可以查看训练过程中损失和精度的变化情况。

参考资料

使用FATE进行图片识别的深度神经网络联邦学习
联邦学习框架FATE实践(训练/测试步骤及参数说明)


版权声明:本文为WenDong1997原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。